この日記はGNSで生成しています。 |
_ さて、速いのはどちら? いやもちろんCPUやコンパイラの実装によって全く結果が異なるのは当然として。
int test_1( char *p ) { return strlen(p1); } int test_2( char *p ) { int l = 0; do { l++; } while (*p++); return l-1; }
_ VC++6.0 on Pentiumだとtest_2()のほうがtest_1()の約半分の時間で終了する。VC++だとstrlen()はccがbuilt-in展開してしまうようだが、このコードがなかなか遅い・・・^^;。8086の頃なら*1VC++のコードのほうが速かったんだろうけど・・・。
*1: repプレフィクスでサーチするコードを吐くが、repはパイプラインを止めてしまうせいかかなり遅いらしい。蛇足だが、VC++ビルトインコードよりtest_2()をinline化したほうがコードサイズが小さくなる。
_ MC68000系とかの「-1のロードが0のロードと同時間で行えるCPU」では、l=-1で初期化してreturn(l)で返したほうがコードが稼げますな。86系だと同じ。
_ 技術革新でバカバカしくなりつつあるとはいえ、たまにはこういうチマチマした稼ぎ技術のカンを戻しておかないと・・・特に今回のなんかは簡単に速度向上が見込める話につながるわけだし*2。
*2: こんなもんで稼がないといけないようなプログラムはそうそうないはずだけど。:-)
メールはこちらへ...[後藤浩昭 / Hiroaki GOTO / GORRY / gorry@hauN.org]