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