memcpy 最適化 - id:kazuhookuのメモ置き場x64じゃないけど、最近のgccはどれくらい最適化が出来てるのかを見たかったので確認してみた。
バイト単位でコピーするアホなコードの方が、勝手にベクトル化される分、gcc 内蔵のヤツより最大3倍高速なんだってwww
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <time.h>
#include <sys/time.h>
void *(memcpy2)(void *__restrict__ b, const void *__restrict__ a, size_t n){
char *s1 = b;
const char *s2 = a;
for(; 0<n; --n)*s1++ = *s2++;
return b;
}
static double getsec() {
struct timeval tv;
double t;
gettimeofday(&tv, NULL);
return tv.tv_sec + (double)tv.tv_usec*1e-6;
}
int main() {
char foo[BUFSIZ];
char bar[BUFSIZ];
int n = 0;
double t;
t = getsec();
for(n = 0; n < 30000000; n++)
memcpy2(foo, bar, sizeof(foo));
printf("adhock memcpy: %f\n", getsec()-t);
t = getsec();
for(n = 0; n < 30000000; n++)
memcpy(foo, bar, sizeof(foo));
printf("normal memcpy: %f\n", getsec()-t);
}
※「-O3 -ftree-vectorize -msse2」※gcc (GCC) 4.3.0 20080305 (alpha-testing) mingw-20080502
P4 3GHzでこんな結果
adhock memcpy: 3.484375
normal memcpy: 3.296875
オプション効いてるのかなぁ...ちなみに「-O3」とかオプション全部抜いたら
adhock memcpy: 75.281250
normal memcpy: 4.515625
こんな酷い結果になった。「-ftree-vectorize」抜いても微妙にしか変らなかった。
シャアにはまだ遠い様だ。
ちなみに、こんな結果もある様なので今後に期待。