如何分析每秒的C#方法?

如何分析每秒的C#方法?,c#,.net,performance,C#,.net,Performance,我不知道这个标题是否有意义,但我正在尝试对两个不同的方法计时,看看它们每秒执行多少次,或者说每10秒执行多少次 例如: DividePolygons1(Polygon[] polys) DividePolygons2(Polygon[] polys) DividePolygons1 ran: 1642 times per 1 second DividePolygons2 ran: 1890 times per 1 second 该类将在这里帮助您,但要小心以某种方式使用结果,以便优化器不会

我不知道这个标题是否有意义,但我正在尝试对两个不同的方法计时,看看它们每秒执行多少次,或者说每10秒执行多少次

例如:

DividePolygons1(Polygon[] polys)
DividePolygons2(Polygon[] polys)

DividePolygons1 ran:
1642 times per 1 second

DividePolygons2 ran:
1890 times per 1 second
该类将在这里帮助您,但要小心以某种方式使用结果,以便优化器不会消除您试图度量的逻辑

除此之外,只需在循环中运行您正在评测的代码数百万次(调整迭代次数,使其在1到30秒之间),然后将迭代次数除以获得每秒执行吞吐量所需的时间。

我会做什么:

  • 启动
    秒表
  • 在这些函数中,我递增一个简单变量(long、float或double,取决于您认为它们将被调用的频率),因此每次调用时它都递增
  • 调用第一个函数
  • 停止
    秒表
    并对照我一直递增的变量检查
    总秒数
  • 重复第二个函数
Visual Studio 2010有一个探查器,它可以确定每个时间单位的方法调用的确切数量。

并且在启动程序时使用发布版本,并且没有附加调试程序。最好在启动基准测试之前运行所有代码一次,这样就不会对JIT之类的启动效果进行测量。别忘了注意引用的位置。如果不能在同一时间创建相同的精确多边形,那么分割这些多边形可能需要更长的时间。@琼:康拉德所说的是,现代处理器在芯片上复制一块内存,并乐观地假设在处理这些多边形的过程中,另一个线程上的内存内容不会发生变化当前线程。芯片上的拷贝称为“缓存”。对缓存中的内容执行内存读取可能比对“未命中”缓存的内容执行内存读取快数百倍。多边形数组的大小及其分配位置的详细信息可能会产生意想不到的巨大性能差异。@琼:这不是一件容易避免的事情,如果没有专门为查询CPU缓存未命中统计信息而设计的探查器,很难进行测量。相反,这只是在分析时需要注意的事情。我最近遇到过这样一种情况,分配更少的内存会使我的应用程序变慢,因为碰巧分配策略的更改导致了不同的缓存未命中模式。这可能会让人很困惑@琼:在使用大型阵列时,需要特别记住的一点是,以“良好的局部性”访问内存是一个巨大的性能胜利。例如,尝试使用嵌套循环的每个元素制作一个大的二维数组和概要文件:For(rows){For(columns){…}}vs For(columns){For(rows){…}--通常会有很大的不同,因为一个会导致大量缓存未命中,而另一个则主要使用“相近”的内存因此可能已经在缓存中了。谢谢,它是专业版的吗?(非终极版)探查器有高级版和终极版,但不支持专业版。请参阅“调试和诊断”下的。