コードの一部が実際のボトルネックを作成していることが明らかになるまで、私はパフォーマンスについてあまり気にしません。このようなボトルネックがあると仮定して、次のコードのパフォーマンスを測定してみましょう (コードは C# ですが、C++ が遅くなることはないと確信しています)。
public class Rectangle
{
public int X { get; set; }
public int Y { get; set; }
public int W { get; set; }
public int H { get; set; }
public bool HitTest(int x, int y)
{
return x >= X && x < X + W && y >= Y && y < Y + H ? true : false;
}
}
メソッドのパフォーマンスに興味があるHitTest()
ので、測定してみましょう。
void PerformanceTest()
{
const int Iterations = 1000000;
Random rnd = new Random();
var rectangles = Enumerable.Range(1, 50).Select(
r => new Rectangle {
X = rnd.Next(1000),
Y = rnd.Next(1000),
W = rnd.Next(1000),
H = rnd.Next(1000)}).ToList();
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < Iterations; i++)
{
rectangles.ForEach(r => r.HitTest(500, 500));
}
sw.Stop();
Console.WriteLine("Elapsed time: {0}ms. ({1}us per one iteration)",
sw.ElapsedMilliseconds,
(float)sw.ElapsedMilliseconds * 1000 / Iterations);
}
私のPCでは、上記のコードは次のように出力されます:
経過時間: 701ms。(1 回あたり 0.701us)
ご覧のとおり、 50 個の長方形のヒット テストにかかる時間は1 マイクロ秒未満です。これは、派手なホバー効果を作成するのにかかる時間や、プログラムが行うその他の処理に比べて長すぎると本当に思いますか? もちろん、この質問に答えられるのはあなただけです。
しかし、私の話の教訓は次のとおりです。事前に最適化しようとしないでください。また、まったく存在しない可能性のある問題を解決しようとして時間を費やしてはなりません。