例如
foo() //Some operation bound by an external resource. db,I/O, whatever.
VS
var watch = new Stopwatch();
watch.Start();
foo()
var time = watch.ElapsedMilliseconds
watch.Stop();
答案 0 :(得分:9)
我相信秒表是建立在QueryPerformanceCounter之上的,因此每次调用都会导致内核转换。如果foo()非常简短,那么QPC开销会使它相形见绌。
如果您使用秒表来测量短任务,则应多次运行foo()(如数千次),并在整批中使用秒表。将总时间除以运行次数,以获得任务的平均时间。
答案 1 :(得分:4)
这听起来像是一个递归的答案,但真正了解秒表惩罚的唯一方法就是测量它。测量托管代码通常涉及秒表实例。
秒表仅用于诊断目的,不应在零售应用中使用。除非你当然处于诊断模式。因此,对于非诊断代码来说,这确实不应该是一个问题。您能否对您的情景提供一些见解,以便我们能够给出更好的答案?
秒表实例(通常)在QueryPerformanceCounter调用之上构建。这些都不是免费的,但它们也不是非常昂贵。任何值得用秒表测量的东西都是一个足够长的运行任务,任务的成本将使QueryPerformanceCounter调用无关紧要。否则,你为什么要测量它?
答案 2 :(得分:2)
根据我的经验,使用Stopwatch
类时, 有一些明显的开销。当然不仅仅是使用Environment.TickCount
或类似的来衡量时间,但仍然不是太太棒了。但是,这对您来说可能是也可能不是一个大问题。如果测量的时间段通常是非常短的时间(通常应该使用Stopwatch
的情况,假设其他方法对于更长时间的计时也同样好),那么性能不应受到明显影响,我想象。此外,this page的结尾还有一点可以说明在您的计划中运行Stopwatch
的费用。 (不确定我是否会接受使用它来进行持续程序监控的建议。)