Re: [请益] C语言memcpy()的效率问题

楼主: i386 (i386 cpu)   2014-04-10 23:18:21
不同的CPU架构, 指令集, OS, Compiler和memcpy function都会影响
效率.
不确定你用的C library里面的memcpy是怎么写的, 单就你结论提到
差距10倍的效率(65536->65535)来推断,最有可能的原因出在alignment
上面..
以下用32bit CPU架构来举例.
如果source和destination在memory中的aligment的位址是对齐4bytes
memcpy会选择用int的单位(32bits)来搬data
如果source和destination在memory中的aligment的位址无法aligment的话,
那memcpy会选择用char(8bits)单位来搬data
这样两者的差别,就有可能会让效率差10倍, 当然这还是要看memcpy里面怎么写的
就你程式中的source和destination都宣告为local variable, 也就是在stack
里面, 你可以自己先确认看看这两个array在内存中的位址. 当然你也可以做
个实验, dst和src在不同的memory aligment下面, 会有怎样的差异.
另外, 你文中提到的.
: 后来改在linux上测(也是没有最佳化选项)
: 改变size(65536->65535),时间没有差异
这个一定会有差异,只是你量测的时间单位无法看出差异而已, 因为就这
两个size来看, 65535一定要处理3个byte非aligment的部份.
※ 引述《kkkmode (kkk)》之铭言:
: ※ [本文转录自 Soft_Job 看板 #1JHAVIT- ]
: 作者: kkkmode (kkk) 看板: Soft_Job
: 标题: [请益] C语言memcpy()的效率问题
: 时间: Wed Apr 9 09:52:15 2014
: 各位好,
: 我测试了一段程式,如下:
: #include <stdio.h>
: #define size 65536
: void main(){
: char source[size], destination[size];
: int j;
: for(j=0; j<100000; j++)
: memcpy(destination, source, size);
: }
: 把size改成65535或65537执行速度大概会慢10倍(compiler没设最佳化)
: 其他2的幂次方加减1也有此现象(例如1024改成1023或1025)
: 我觉得可能是cache没命中造成的
: 但详细的原因不是很清楚
: 如果各位知道原因的话请帮忙一下,谢谢
: ******************************************************************
: 补上编译环境:
: IDE: code::blocks 13.12
: compiler套件: TDM-GCC, v4.7.1, 32 bit
: 作业系统: windows 8.1 64 bit
: CPU: intel core-i3 2100
: 后来改在linux上测(也是没有最佳化选项)
: 改变size(65536->65535),时间没有差异
: objdump也试过,我是输入以下两行指令:
: gcc -Wall -O0 -g main.c -o main.exe
: objdump -Sl
作者: EdisonX (卡卡兽)   2014-04-10 23:45:00
我看过的实作,如果没 aligment 的话,会先把头尾复制到aligment(用 char), 接着再用 int 做复制。
作者: akasan (KITO)   2014-04-11 00:40:00
to EdisonX:那也要 src 跟 dst 的 align 一样才可以两个 align 不一样的话就还是会有一边 unalign access
作者: EdisonX (卡卡兽)   2014-04-11 01:08:00
也是, 忘了这点.
作者: yvb   2014-04-11 01:42:00
有一些测试数据, 我放在在原原PO文章的推文中.
作者: dirkc (3781615)   2014-04-15 17:04:00
这事的结论挺让人讶异,在使用上不得不考虑有10倍差的可能性

Links booklink

Contact Us: admin [ a t ] ucptt.com