最適化…、おそろしい。
なんとなく、いろいろと最適化に挑戦してみた。勉強の為なのでネットで最適化を調べたりするのではなく、glibcのソースコードと自作のコードのアセンブリを見ながら地力で最適化に挑戦した。
あれこれ試していて、ふとRHLinux右下の時計に目をやると3時22分。げぇ、7時間もたってる。晩飯も、水分も、いっさいとってない…。われながら素晴しい集中力だ。
最適化に関してはここで書くような、面白いものは分からなかった。強いて言えば、次の二つのコードは上の方が弱冠速かった(ほんとに少しだけだけど)。
/* sbuffer_tっていうのは文字列用の構造体です */ void chrrep(sbuffer_t *sbuf, char src, char dst) { unsigned char *p = (unsigned char *)sbuf->string; for (; *p != '\0'; ++p) if (*p == src) *p = dst; } void chrrep(sbuffer_t *sbuf, char src, char dst) { char *p = sbuf->string; for (; *p != '\0'; ++p) if (*p == src) *p = dst; }
そんなことよりもglibcのstrstr()のコードが理解できん。明日以降にでもなんとか解読するつもり。そのコードの先頭のコメントにこんな挑戦的な文章がある。
/* * My personal strstr() implementation that beats most other algorithms. * Until someone tells me otherwise, I assume that this is the * fastest implementation of strstr() in C. * I deliberately chose not to comment it. You should have at least * as much fun trying to understand it, as I had to write it :-). * * Stephen R. van den Berg, berg@pool.informatik.rwth-aachen.de */
こら、Stephen、コメント書け。嘘です。面白いから良いのです。ちょっとした(いや、大掛かりな)クイズだと思って解かせて頂きます。