设为首页 加入收藏

TOP

关于内存比较和字节对齐
2014-11-23 21:45:54 来源: 作者: 【 】 浏览:9
Tags:关于 内存 比较 字节

作者blog:87year.info

昨天在淘宝核心团队成员http://donghao.org/2011/02/uaeei.html看到一篇内存比较的文章,并不是说文章有错误,只是在我现在工作的平台下有些小问题.

原文很小,直接粘贴过来
――――-以下是引用――――――――――――

判断上百万个4k的buffer是否为全0,我最先想到的办法是:

zero_buffer = malloc(4096);
memset(zero_buffer, 0, 4096);
/* 循环百万次读取buffer */
if (!memcmp(zero_buffer, buffer)) {
/* 全0 */
}
做完以后跑了一下,速度凑合。由于好奇,看看shell工具cp的代码,它的解决办法是:
/* 循环百万次读取buffer */
long *wp = buffer;
while (*wp++ ==0 && wpcontinue;
if (wp >= buffer + 4096) {
/* 全0 */
}
cp的代码真称得上千锤百炼,这比我的方法要快,因为我的办法需要CPU访问两块内存(buffer和zero_buffer),而cp只问一块内存,CPU的cache会高效得多。
判断一块4k buffer当然看不出快慢,我们循环上百万次,立刻就能看出差别:cp的算法比我的快了3倍。
―――――引用结束―――――――――――――

第一份代码,直接使用memcmp比较.原文的评论中说有点绕,但是不出问题.

第二份说是来自linux shell的cp源码.我认为在某些平台有潜在错误.

它”假设”buffer是4字节对齐,万一平台中不是4字节对齐.那么程序就直接挂了.

在windows mobile平台下做的实验代码.

――――-代码开始――――――――――――
long zero_buf[24]={0};
memset(zero_buf,0×0,sizeof(long)*24);//初始化
long *wp = (long*)((byte*)zero_buf+3);//故意不对齐
while (*wp++ ==0 && wpif (wp >= zero_buf + 4096){
/* 全0 */
}
――――代码结束――――――――――――

update:

突然想起之前看过的一份strcpy源码.也是利用long类型来加速拷贝,在拷贝之前判断是否对齐.如果结合strcpy来做上面这个命题的话,应该更稳定.

推荐阅读:

1.html" target=_blank>stcpy分析

2.strlen分析

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇MFC遍历文件夹(遍历目录),遍历文件 下一篇空间换时间

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: