虫川大杉(意味不明
やっぱりというべきか、ミスを発見したので訂正。
int _strncmp(void *buf, void *str, size_t size){ int *b = (int *)buf; int *s = (int *)str; unsigned int k = size >> 2; for(unsigned int i=0;i<k;i++){ if( (b[i])^(s[i]) ){ return (ntohl(b[i]) - ntohl(s[i])); } } k <<= 1; short *sb = (short *)buf; short *ss = (short *)str; if( (size & 2) && ( (sb[k])^(ss[k]) ) ){ return (ntohs(sb[k]) - ntohs(ss[k])); } k++; k <<= 1; char *cb = (char *)buf; char *cs = (char *)str; if( (size & 1) && ( (cb[k])^(cs[k]) ) ){ return (cb[k] - cs[k]); } return 0; }
追加箇所は12行目“k++;”の1文。charの部分でshortで調べた箇所の上位バイトを再度調べていたことに今更ながら気づく(sb[k]=cb[2*k])。しっかりと内容を検証していないことが露呈されているわけで・・・。
ついでに、memcmp()はsizeの指定如何で速度が変わる疑いが。どんな実装がなされているのかますますもってわからん。
ntohl()やらntohs()やらを統合して冗長なレジスタ操作を排したアセンブラコードも作ってみたのですが、コードとしては短いながらも60行を貼り付けるのもどうかと思うので省略。速度的にも昨日の最後に貼った_ntohl()や_ntohs()を使ったものと比べて36秒対38秒と少ししか速くなっていないし。