私のプロジェクトでは、実行時間が最初の目標であるクラスがあります。そのため、メンテナンスや注文などはあまり気にしません。せめて昨日までは気にならなかったのに…。
私は、カメラからの画像に対して複数のスキャンを実行するクラス、つまりAを持っています。つまり、可変幅のウィンドウがそれらをリアルタイムでスキャンします。
class A{
// methods and attributes of A:
...
void runiterator(){
...
for{ // change window’s dimension
for{ // rows
for{ // columns
// many lines of code of operations to be executed for each window at each position
...
}
}
}
}
};
パフォーマンスはすでに少し遅れていますが、画像の限られた領域をスキップすることで解決できました。さらに、B という 2 番目の関数があります。これは A とまったく同じスキームを持ち、スキャンごとに異なる操作を実行します (幸いなことに、A よりもはるかに高速です)。
さて、今度はすべての操作を結合して、全体的な結果を大幅に改善する時が来ました。コードが本当にめちゃくちゃになり、巨大で、本当に異なるものが混ざり合っているということだけです。反復を行い、各スキャンで A_new の 1 つの関数と B_new の 1 つの関数への関数呼び出しを実行するクラス X を定義することを考えました。しかし、画像ごとに約 200000x2 関数呼び出しを行うと、パフォーマンスが低下するのではないかと心配しています。
あなたのアドバイスは何ですか?
編集
Anew のみを呼び出すクラス X (したがって、現在の A とのみ比較できます) では、多くの繰り返しから平均して取得します。
一連の 56 枚の画像で X を実行する時間 = 6.15 秒 56 枚の
同じ一連の画像で A を実行する時間 = 5.98 秒
私の容疑者はそれほど素朴ではなかったようです。
差は約3%とそれほどでもないのですが、それでも損はしてしまいます。
__forceinline を使用すると、X の時間も 5.98 秒になりますが、これに頼らない方がよいでしょう。
コードは最適化されており、さらなる改善の余地はほとんどないと思います。
実際、比較的短い時間で多くの処理を画像に対して行います。
クラス A ではデータを順次処理することはできません。これは、画像から得られる予測不可能な値に基づいているためです。これが、クラス B (それを実行する) がはるかに高速である理由です。