私は Qt ベースの MacOS/X オーディオ メータリング アプリケーションに取り組んでいます。これにはオーディオ メータリング ウィジェット (多くの可能性があります) が含まれており、それぞれが 50ms ごとに (つまり 20Hz で) 更新されるはずです。
プログラムは動作しますが、一度に多数のメーターが更新されると、CPU 時間が大量に消費され、動きが鈍くなる可能性があります (スピニー カラー ホイール、なんてこった!)。
奇妙なことに、このアプリは元々、メーターの値が変更されるたびにメーター ウィジェットで update() を呼び出すだけだったため、メーター ウィジェット全体が 50 ミリ秒ごとに再描画されていました。ただし、私は賢く、実際に再描画する必要があるメーターの領域だけを計算し、ウィジェットのその部分のみを再描画すると考えました (たとえば、y と h が update(x,y,w,h) の場合)。メーターの古い値と新しい値に基づいて計算されます)。しかし、私がそれを実装すると、実際には CPU 使用率が 4 倍になりました (!)... アプリが毎秒 50% 少ないピクセルを描画していたにもかかわらず。
この最適化が実際にペシミゼーションになる理由を誰か説明できますか? ここに、効果を示す簡単なサンプル アプリケーションを投稿しました。
http://www.lcscanada.com/jaf/meter_test.zip
上記のアプリをコンパイル (qmake;make) し、次のように実行すると:
$ ./meter.app/Contents/MacOS/meter 72
Meter: Using numMeters=72 (partial updates ENABLED)
... top は、~50% の CPU を使用しているプロセスを示しています。
次のように実行して、巧妙な部分更新ロジックを無効にすると、次のようになります。
$ ./meter.app/Contents/MacOS/meter 72 disable_partial_updates
Meter: Using numMeters=72 (partial updates DISABLED)
... top は、~12% の CPU しか使用していないプロセスを示しています。は?この場合、より多くの CPU を使用するべきではありませんか?
Shark を使用してアプリのプロファイリングを試みましたが、結果はあまり意味がありませんでした。FWIW、私は 8 コアの Xeon Mac Pro で Snow Leopard を実行しています。