作者flyaway339 (豪)
看板C_and_CPP
標題[問題] for迴圈執行時間差異(64bit vs 32bit)
時間Mon Jun 24 22:38:42 2019
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
Linux - terminal
問題(Question):
在32bit 64bit執行下列迴圈
發現在32bit花了15ms, 在64bit卻只要3ms
不明白主要是什麼機制造成, 是因為data aligment?
網路上也找不太到資料, 還請大大解惑, 感謝
此外如果想要在32bit上加速執行時間, 有什麼方法或編譯方式可以用?
int y = 16500;
for (int i = 0; i < 1000; ++i) {
ptr1 += (y >> 16)*2000;
for (int j = 0; j < 2000 ; j += 2) {
ptr2[1] = ptr2[0] = ptr1[0];
ptr1 += 1;
ptr2 += 2;
}
ptr2 += 4000;
y += 33000;
}
註: uint8_t *ptr1 , uint8_t *ptr2
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.140.228.173 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1561387124.A.C4C.html
※ 編輯: flyaway339 (223.140.228.173 臺灣), 06/24/2019 22:41:13
※ 編輯: flyaway339 (223.140.228.173 臺灣), 06/24/2019 22:42:00
※ 編輯: flyaway339 (223.140.228.173 臺灣), 06/24/2019 22:43:31
※ 編輯: flyaway339 (223.140.228.173 臺灣), 06/24/2019 22:44:23
1F:推 Schottky: 我是沒有實際去跑,但應該是被編譯器最佳化了06/24 22:58
2F:→ Schottky: 程式本身是否有寫錯,y>>16 結果應該一直是 006/24 22:59
y 會一直累加上去,後面不會是0
3F:→ longlongint: 你的CPU是32還6406/25 00:21
64
4F:推 kokal: ptr2的跨幅還蠻大的, virtual memory部分應該做了不少事?06/25 00:34
ptr1也是,會要一直位移
※ 編輯: flyaway339 (223.137.124.192 臺灣), 06/25/2019 12:10:30
※ 編輯: flyaway339 (223.137.124.192 臺灣), 06/25/2019 12:12:02
5F:→ atrix: 可能因為32程式在64系統上要轉換過才能用,keyword WOW64 06/26 11:49
6F:推 dces4212: 編譯時個別帶什麼flag? 07/03 00:00