プログラムの一部は、順序付きリストを検索する際に2つのc-stringが同一であるかどうかを確認する必要があります(例:{"AAA", "AAB", "ABA", "CLL", "CLZ"}
)。リストがかなり大きくなる可能性があるので、速度のわずかな向上は可読性の低下に値する。あなたがC++に制限されていると仮定します(アセンブリへの切り替えを推奨しないでください)。どのように改善することができますか?C++ if文の順序
typedef char StringC[5];
void compare (const StringC stringX, const StringC stringY)
{
// use a variable so compareResult won't have to be computed twice
int compareResult = strcmp(stringX, stringY);
if (compareResult < 0) // roughly 50% chance of being true, so check this first
{
// no match. repeat with a 'lower' value string
compare(stringX, getLowerString());
}
else if (compareResult > 0) // roughly 49% chance of being true, so check this next
{
// no match. repeat with a 'higher' value string
compare(stringX, getHigherString());
}
else // roughly 1% chance of being true, so check this last
{
// match
reportMatch(stringY);
}
}
あなたはstringX
とstringY
が常に同じ長さであると仮定することができますし、無効なデータ入力を取得することはありません。
コンパイラは、CPUが最初のif文をチェックして偽であればジャンプするようにコードを作成するので、最初の文が真である可能性が最も高い場合に最適ですジャンプがパイプラインに干渉します。私は、比較を行うときに、[n Intel] CPUが減算を行い、減算の結果を保存せずにフラグの状態を調べると聞いています。 strcmp
を1回実行し、結果を変数に保存せずに、最初の2つのif文の両方でその結果を確認することはできますか?
私はあなたがC++(現在あなたがC++構文の_touch_とCコードを持っている)に切り替えることをお勧めしたいです。そのコードパスについてマイクロオプティマイゼーション:**生成されたアセンブリの出力を調べる(驚くかもしれません...)**より重要な入力パターン**(いくつの連続した ' 0 '?)よりも多くの共通コードパスより大きい。最終的な注記:C言語で行う場合、**固定長の文字列には 'strcmp'の代わりに' memcmp'を使用することができます** –
* "結果を変数に保存せずにstrcmpを1回実行する方法"なぜ?! 'strcmp'は結果を' int'の形で生成します。変数はすでにその目的のために割り当てられています。 'compareResult'に格納しないと、何も得られません。あなたの現在のコードは、Cスタイルの構文を選択するといいですね。 – iammilind
'compare'はあなたのプログラムのランタイムを改善する間違ったレベルです。あなたはそれが順序付けされたシーケンスだと言いましたので、はるかに良いアプローチは、あなたのシーケンス(私が推測する)上でのライナー検索ではなくバイナリサーチです。あなたはC++を使っているので、適切なコンテナを使用することができます( 'std :: set')。 –