1. アルゴリズム
strcmp の実装には、より優れたアルゴリズムがある可能性があります。strlen を呼び出す必要はまったくありません。strlen を呼び出すたびに、文字列全体が繰り返し処理されます。シンプルだが効果的な実装をオンラインで見つけることができます。おそらく、次のような場所から始めましょう。
// Adapted from http://vijayinterviewquestions.blogspot.co.uk
int xstrcmp(const char *s1, const char *s2)
{
for (;*s1==*s2;++s1,++s2)
{
if(*s1=='\0') return(0);
}
return(*s1-*s2);
}
これですべてができるわけではありませんが、ほとんどの場合、シンプルで機能するはずです。
2. コンパイラの最適化
ばかげた質問ですが、コンパイル時にすべての最適化スイッチをオンにしたことを確認してください。
3. より洗練された最適化
ライブラリを作成する人は、4 バイトまたは 8 バイトの int を一度にロードして比較し、全体が一致する場合は個々のバイトのみを比較するなど、より高度な手法を使用することがよくあります。このケースに何が適切かを知るには専門家である必要がありますが、スタック オーバーフローの最も効率的な実装について議論している人々を見つけることができます (リンク?)
一部のプラットフォーム用の一部の標準ライブラリ関数は、コンパイラが検出できるよりも効率的な実装があることをコーダーが認識できる場合、アセンブリで手書きされる場合があります。現在、これはますますまれになっていますが、一部の組み込みシステムでは一般的かもしれません。
4. 標準ライブラリを使用したリンカの「ごまかし」
一部の標準ライブラリ関数では、リンカーは関数の特定の内部構造について詳しく知るように設計されているため、コードで関数を呼び出すよりも少ないオーバーヘッドでプログラムにそれらを呼び出させることができる場合があります (リンク?)この場合は当てはまりますが、おそらく当てはまらないでしょうが、それはあなたが考えなければならない種類のものです.
5. OK、OK、それはわかりましたが、独自の strcmp を実装する必要があるのはいつですか?
私の頭の上から、これを行う唯一の理由は次のとおりです。
- あなたは方法を学びたいです。これは正当な理由です。
- 十分な標準ライブラリがないプラットフォーム向けに書いています。これはほとんどありません。
- 文字列の比較は、コードの重大なボトルネックであることが測定されており、文字列に固有の何かを知っているため、単純なアルゴリズムよりも効率的に比較できることを意味します。(たとえば、すべての文字列が 8 バイト アラインで割り当てられているか、すべての文字列に N バイトのプレフィックスが割り当てられています。) これは、非常にありそうもないことです。
6. でも…
OK、なぜ strlen に頼るのを避けたいのですか? コードサイズが気になりませんか?コードまたは実行可能ファイルの移植性について?
正当な理由がある場合は、別の質問を開いてください。より具体的な回答があるかもしれません。明らかな何かが欠けている場合は申し訳ありませんが、特に改善したいことがない限り、通常は標準ライブラリに依存する方がはるかに優れています。