我的问题由两部分组成:
Stopwatch )之外,有没有其他测量计算工作量的好方法?下面是我一直在做的事情,但是粒度不是很好,每次返回的结果都是不同的。我想知道是否有更精确的度量,例如CPU操作计数,以便返回的结果可以是一致的。
秒表Stopwatch =新秒表();stopWatch.Start();//do work stopWatch.Stop();TimeSpan ts = stopWatch.Elapsed;Console.WriteLine(ts);(键入后续文本后,我意识到我也尝试了Visual附带的性能分析功能。由于所采用的抽样方法,测试结果显得更加粗糙。所以我也想排除这个选择)
发布于 2014-08-08 03:28:19
你需要一个分析工具。但是,如果您在循环中多次运行测试,但只有当垃圾收集生成保持不变时,您才能更可靠地使用StopWatch。
如下所示:
var timespans = new List<TimeSpan>();
while (true)
{
var count = GC.CollectionCount(0);
var sw = Stopwatch.StartNew();
/* run test here */
sw.Stop();
if (count == GC.CollectionCount(0))
{
timespans.Add(sw.Elapsed);
}
if (timespans.Count == 100)
{
break;
}
}这将给您100个没有发生垃圾收集的测试。然后,平均水平是相当好的工作。
如果您发现您的测试从未在没有调用垃圾收集的情况下运行,那么尝试计算出触发的GC的最小数量,并且只在发生这个数目时收集您的时间。
发布于 2014-08-08 03:44:04
您可以查询系统性能计数器。用于System.Diagnostics.PerformanceCounter类的msdn文档有一些例子。使用这个类,您可以查询“进程(Your_process_name)\%处理器时间”。这是秒表的另一种选择,但我认为,使用秒表,并在一段时间内平均跑几圈是一个非常好的方法。
如果您需要一个更高分辨率的秒表,因为您正在尝试测量一个非常小的部分cpu时间,那么您可能对高性能计数器感兴趣。
https://stackoverflow.com/questions/25195512
复制相似问题