题
这个问题已经有一个答案在这里:
- 的确切时间测量性能测试[重复] 8的答案
我在寻找一种方法的基准方法的呼吁。
我有编码数据的数据结构为大学的分配,并只找到了一种方法来优化了一点,但在一个方式,将增加一点的开销在所有情况下,同时把一个O(n)调入O(1)在一些。
现在我要运行两个版本对测试数据来看,如果它的价值实现最优化。我知道,在红宝石,你可以包码在一个基准框并把它输出所需的时间来执行该框在控制台有一些像这样的可C#?
解决方案
你可以使用的内在 秒表类 以"提供了一套方法和属性,可用于准确测量时间。"如果你是在寻找一个手动的方式来做到这一点。不知道在自动化虽然。
其他提示
被盗(及修改)从尤里的回答:
private static void Benchmark(Action act, int iterations)
{
GC.Collect();
act.Invoke(); // run once outside of loop to avoid initialization costs
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
act.Invoke();
}
sw.Stop();
Console.WriteLine((sw.ElapsedMilliseconds / iterations).ToString());
}
往往一个特定的方法具有初始化的一些事,你不总是要包括这些初始化成本的整体基准。还有,你想要来划分的总的执行时间通过数次迭代,所以是你的估计数是或多或少独立的次数的迭代。
我偷了下面的大多数从Jon双向飞碟的方法为基准:
private static void Benchmark(Action act, int interval)
{
GC.Collect();
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < interval; i++)
{
act.Invoke();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
这里有一些东西我已经找到了通过试验和错误。
- 丢弃第一批的其他收入和调整(单位:千)的迭代。他们将最有可能受到影响的抖动。
- 执行基准测试,在一个单独的
Thread
对象可以得到更好的和更稳定的结果。我不知道为什么。 - 我已经看到一些人使用
Thread.Sleep
不管什么原因之前执行的基准。这只会让事情变得更糟。我不知道为什么。可能是由于抖动。 - 从来没有运行的基准调试启用。代码很可能将运行订单的幅度较慢。
- 编译程序的所有优化启用。一些代码,可以大大影响的最优化,而其他代码不会,所以编制没有优化会影响的可靠性的基准。
- 当汇编优化启用的,这有时是必要的,以某种方式进行评估的输出基准(例如印值,等等)。否则编译器可能'图出一些计算是没用只会不执行它们。
- 援引的代表可以有明显的开销时执行某些基准。这是更好地把多于一个迭代的内部委托,以便开销几乎没有影响的结果的基准。
- 分析器可以有自己的开销。他们是很好的在告诉你这份代码的瓶颈,但是他们并不善于实际的基准的两个不同的东西可靠。
- 在一般情况下,花哨的基准解决方案可以有明显的开销。例如,如果你想要的基准,许多对象,使用一个接口,它可能会被诱惑到包裹的每个对象中的一类。但是,记住这一类的构造也已开销,必须加以考虑。这是更好地保持一切为简单的和直接的成为可能。
剖析得到的最好的基准,由于他们的诊断代码,但他们的速度放慢了很多。分析仪被用于寻找瓶颈。
对于优化算法,当知道其中的瓶颈问题,使用一个字的名称-->秒表,以跟踪业绩的关键部分期间,运行时间。
不隶属于 StackOverflow