今年度から、組み込み Linux で仕事をすることになりました。と思ったら、先月中から Windows アプリケーション作成のヘルパーに突っ込まれました。いや、「作りながら仕様が決まっていく」ってのは、精神衛生上、良くないです。私にとっては。
そんな中、メインの仕事で、「標準の memcpy は遅いから、(32ビット CPU なので)4バイトずつ転送するように作り直して」と、指示されました。
え?まさか?標準のライブラリの方が、私なんかが作るより速いでしょ?
とか思いながら、実機ではデバッグ環境がないので、Visual Studio 上でコードを書き、テストして、計ってみます。やっぱり、標準の方が速い。それを実機用にコンパイルし直し、実機で計ると…
書き直した方が速い!
何でやねん?
Microsoft による実装を見ました。アセンブリが読めません。代わりにコメントを読むと、SSE2 が使える環境では、SSE2 を使います。そうでなければ、転送先が4の倍数なら4バイトずつ、そうでなければ1バイトずつ転送する。となっていました。
次。Linux も見ます。アーキテクチャによる memcpy が定義されていないなら、1バイトずつ転送するようになっていました。じゃ、アーキテクチャによる実装は?PowerPC のアセンブリは、さっぱりわかりません。しかし、IBM のエンジニアが書いているらしいので、それくらいの工夫はされているように思います。
ということは、開発環境が参照するライブラリがヘボいってこと?まさかなぁ?