文字列の比較とキャスト
Javaをやらないとと思いつつもC言語にて生きるおみ。
今日は文字列において比較する長さが既に16/32bitの整数倍であると分かっている場合、char *を用いたstrcmp()/strncmp()とint *あるいはshort *にキャストしたものはどちらが高速であるかという虚無をしていました。int=32bit、short=16bitを仮定。
↓曰く、こんなもの。
int intncmp(void *buf, void *str, int size){ int *b = (int *)buf; int *s = (int *)str; int i; size >>= 2; for(i=0;i<size;i++){ if(b[i]-s[i]){ return 1; } } return 0; }
同一であるかのみを判定するために多少簡略化してあるので厳密には同一ではないが、strncmp()と同様の処理を行う関数である。
結果は案の定というか、intncmp()の方が高速でした。4Byteと分かっていれば
int intcmp(void *buf, void *str){ int *b = (int *)buf; int *s = (int *)str; return( (*b)-(*s) ); }
このようにすれば更に高速に。2Byteの場合はshortで定義することで実現できます。
何にせよ、虚無であることに変わりなく。アセンブラの読み書きができればもっと効率よくできるでしょうし。