现在的位置: 首页 > 综合 > 正文

内存拷贝程序的优化–利用系统的特性

2013年08月08日 ⁄ 综合 ⁄ 共 1307字 ⁄ 字号 评论关闭

/*********************************************************************
 * Author  : Samson
 * Date    : 07/04/2012
 * Test platform:
 *               GNU Linux version 2.6.29.4
 *               gcc version 4.4.0 20090506 (Red Hat 4.4.0-4) (GCC)

 * *******************************************************************/

我们经常会自己实现写一些系统函数, 但是不一定是性能最优的,那么如何达到速度最快呢? 现就将附带例子进行关于利用硬件特性或叫系统特性来进行内存拷贝的程序的优化。


如下代码是没有优化的普通的性能的函数:

#include <stdlib.h>

#include <stdio.h>

void *_memcpy(void *dest, const void *src, size_t n)
{
    
    char i;
    
    char *Pdest = (char *)dest, *Psrc = (char *)src;
    for(i = 0; i < n; i++)
    {
        *Pdest = *Psrc;
        Pdest += 1;
        Psrc += 1;
    }
    return dest;

}

int main()
{

    char strname[20] = "samson.wen";
    char strcountry[20] = "China";
    _memcpy(strcountry, strname, 8);
    printf ("strcountry now value is %s\n", strcountry);
    return 0;    

}

编译运行后的结果是:

[root@UFO testascii]# ./a.out
strcountry now value is samson.w

那么面对以上的程序如何来做优化呢?  就利用一下系统的字长来做做优化吧, 我所使用的系统的字长为32位,也就是说一条指令的最大长度,那么就专门针对size_t n这个参数能够被4整除的数来修改成如下:

void *_memcpy(void *dest, const void *src, size_t n)
{
    
    char i;
    int num = n / sizeof(int);
    
    int *Pdest = (int *)dest, *Psrc = (int *)src;
    for(i = 0; i < num; i++)
    {
        *Pdest = *Psrc;
        Pdest += 1;
        Psrc += 1;
    }
    return dest;

}

其中, i改为char型,可以节省三个字节, 然后在每次内存复制的时候是按字长(一般系统的int型的长度即是一个字长)来进行复制,这会大大节约系统调用的调用次数,相应的时间也就用的更少了,也就达到了优化的效果,这种效果尤其是在嵌入式系统中的时候。


你还有更好的优化方法吗??? 若有,还请不吝赐教。

抱歉!评论已关闭.