首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在efficiency/complexity/performance/expensiveness中可靠地测量代码C#?

如何在efficiency/complexity/performance/expensiveness中可靠地测量代码C#?
EN

Stack Overflow用户
提问于 2014-08-08 03:08:48
回答 2查看 161关注 0票数 0

我的问题由两部分组成:

  1. 在C#中,除了使用计时器(如Stopwatch )之外,有没有其他测量计算工作量的好方法?下面是我一直在做的事情,但是粒度不是很好,每次返回的结果都是不同的。我想知道是否有更精确的度量,例如CPU操作计数,以便返回的结果可以是一致的。 秒表Stopwatch =新秒表();stopWatch.Start();//do work stopWatch.Stop();TimeSpan ts = stopWatch.Elapsed;Console.WriteLine(ts);
  2. 如果1中的替代方法是不可能的,我如何使性能测试结果的变量更少?哪些因素可以使结果发生变化?会关闭所有其他运行帮助的应用程序吗?(我确实试过了,但似乎没有明显的效果。)在VM、沙箱等上运行测试如何?

(键入后续文本后,我意识到我也尝试了Visual附带的性能分析功能。由于所采用的抽样方法,测试结果显得更加粗糙。所以我也想排除这个选择)

EN

回答 2

Stack Overflow用户

发布于 2014-08-08 03:28:19

你需要一个分析工具。但是,如果您在循环中多次运行测试,但只有当垃圾收集生成保持不变时,您才能更可靠地使用StopWatch

如下所示:

代码语言:javascript
复制
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的最小数量,并且只在发生这个数目时收集您的时间。

票数 1
EN

Stack Overflow用户

发布于 2014-08-08 03:44:04

您可以查询系统性能计数器。用于System.Diagnostics.PerformanceCounter类的msdn文档有一些例子。使用这个类,您可以查询“进程(Your_process_name)\%处理器时间”。这是秒表的另一种选择,但我认为,使用秒表,并在一段时间内平均跑几圈是一个非常好的方法。

如果您需要一个更高分辨率的秒表,因为您正在尝试测量一个非常小的部分cpu时间,那么您可能对高性能计数器感兴趣。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25195512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档