,直到它變得清晰,一段代碼創建了一個真正的瓶頸,我不會被人打擾太多關於性能。讓我們假設你有這樣的瓶頸,並測量以下代碼的性能(這是在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);
}
在我的電腦上面的代碼打印:
執行時間:701ms。 (每一次迭代0.701us)
正如你所看到的,它需要不到一微秒的命中測試50米的矩形。你真的覺得這個時間太長了嗎?與創建幻想懸停效果的時間相比,你的程序還有其他什麼?當然,只有你可以回答這個問題。
但我的故事的寓意是:不要試圖預先優化,不花時間試圖解決它可能不存在的一個問題。
使用PtInRect該函數。如果存在效率問題,請進行配置並進行更改。 – 2012-03-02 15:53:00