2008/06/18


試してみた
memcpy 最適化 - id:kazuhookuのメモ置き場

バイト単位でコピーするアホなコードの方が、勝手にベクトル化される分、gcc 内蔵のヤツより最大3倍高速なんだってwww

x64じゃないけど、最近のgccはどれくらい最適化が出来てるのかを見たかったので確認してみた。
#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」抜いても微妙にしか変らなかった。

シャアにはまだ遠い様だ。

ちなみに、こんな結果もある様なので今後に期待。
Posted at by | Edit