なんか 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が遅い。つかスループットは一緒のはずだが…?何?あんまり非同期じゃないとかか…オーヴァーラップしようオーーヴァーーラップ(めんどいのでやらないが)。
なんか疲れてきた。つか昼だし。まあまた来週にするか。(やらないフラグ)