いや

なんか GCC で -O3 -minline-all-stringops すると 2.5[ns/b] とか出るな…

いや -m64 かどうかが違うのか。いややっぱなんかちがうな。ごめんwriteしてなかったわ。

GCCのは、if (len > 8) else if (len > 4) else if (len > 2) .. みたいなコードが出てるが。

とりあえずどの環境でも2.7[ns/b]で安定する↓でいくか。(GCCが出したコードをパクった)

static void __fastcall
output(int len, printf_output *out, const char *data)
{
    int off;
    unsigned char *dst = (unsigned char*)out->buffer + out->cur;
    if (len >= 8) {
        memcpy(dst, data, len);
        return;
    }

    off = 0;

    if (len & 4) {
        *(int*)dst = *(int*)data;
        off += 4;
    }

    if (len & 2) {
        *(short*)(dst+off) = *(short*)(data+off);
        off+=2;
    }

    if (len & 1) {
        *(char*)(dst+off) = *(char*)(data+off);
    }

    out->cur += len;
}
  • 2.5[ns/b] : linux gcc -m64 -O3 -minline-all-stringops libc-memcpy / 上のoutput
  • 2.7[ns/b] : Win32 Win64 上のoutput
  • 2.8[ns/b] : Win64 libc-memcpy
  • 3.0[ns/b] : linux gcc -O2 libc-memcpy / 上のoutput
  • 4.5[ns/b] : Win32 libc-memcpy (※)


※いや違うな。Win32/Win64はWriteFileが遅い。つかスループットは一緒のはずだが…?何?あんまり非同期じゃないとかか…オーヴァーラップしようオーーヴァーーラップ(めんどいのでやらないが)。


なんか疲れてきた。つか昼だし。まあまた来週にするか。(やらないフラグ)