これは、バッファリングされたソースからデータを取得し、それを送信して処理するフラグメントです。キューが空の場合、get() は null を返し、プロセス メソッドは null を受け取って何もしません。これをコーディングする最も最適な方法は何ですか?
something a; // any legal C++ return type...
aQueueOfSomethings g;
while (true) {
a=g.get();
process(a);
}
get() 経由で到着する値を予測する方法はありません。それらはそのままであり、可能な限り迅速にキューから取り出して process() に渡す必要があります。
「a」という名前の明示的なローカル変数をスキップして、ループを 1 つのライナーにすると、無駄な労力はあまり見られません。
process(g.get());
g.get() の暗黙の戻り値にはまだスペースが割り当てられており、コンストラクターの呼び出しなどが含まれる可能性があります。
返されたものにサイズや複雑さがある場合は、そのコピーではなくそれへのポインターを持ち、値によるコピーではなくそのポインターを渡す方がよいでしょう...だから私は
something *a;
g.get(a);
process(a);
それよりも
something a;
a=g.get();
process(a);
2 行バージョンと 1 行バージョンを試して、100,000,000 回ループするテスト ケースを c++ で作成しました。
a が 4 つの整数と 2 つの浮動小数点数を持つオブジェクトであり、process() メソッドがそれらすべてに触れる場合、実際には 2 行のソリューションの方が高速です! オブジェクトが単一の int の場合、1 行バージョンの方が高速です。オブジェクトが複雑で、process() メソッドが 1 つの値に触れるだけの場合は、1 行バージョンの方が高速です。
私にとって最も興味深いのは、g++ コンパイラ、Mac OS X 10.5.8 を使用して、-O 第 1 レベルの最適化スイッチを使用すると、1 行バージョンと 2 行バージョンの両方で同じ、はるかに高速な操作が得られることです。
コンパイラに最適化させ、両方のメソッドを 1 行で明示的な中間変数を使用せず、参照渡しでコピーを作成しないようにする以外に、一般的に実行を高速化するものはありますか? 明らかな何かが欠けているように感じます。