如何计算函数执行的时间?

时间:2016-01-13 15:02:09

标签: c#

我有一个项目,其中我编写了使用两种不同公式计算相关系数的代码。

我应该计算每个公式产生输出所需的时间,然后比较这些时间以确定哪个更快。

我该怎么做?我可以在同一个项目中完成,还是必须在不同的项目中分别处理每个公式?

5 个答案:

答案 0 :(得分:4)

您可以使用Stopwatch来衡量功能所用的时间。

https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch(v=vs.110).aspx

来自dotnetperls的例子:

using System;
using System.Diagnostics;
using System.Threading;

class Program
{
static void Main()
{
// Create new stopwatch.
Stopwatch stopwatch = new Stopwatch();

// Begin timing.
stopwatch.Start();

// Do something.
for (int i = 0; i < 1000; i++)
{
    Thread.Sleep(1);
}

// Stop timing.
stopwatch.Stop();

// Write result.
Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed);
}
}

答案 1 :(得分:2)

您可以使用Stopwatch类来衡量方法执行的时间。

Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();

CalculateStuff();
stopWatch.Stop();

// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;

答案 2 :(得分:1)

快速而肮脏的方法

在最简单的级别,您可以在每个函数的开头和结尾将当前时间输出到Visual Studio中的即时窗口,然后比较这些值。

如果在功能开始之前添加它:

Debug.WriteLine("Function X started at: " + DateTime.Now.ToLongTimeString());

在你的功能完成之后:

Debug.WriteLine("Function X ended at: " + DateTime.Now.ToLongTimeString());

这将写入即时窗口。我假设你只是在调试模式下在Visual Studio中运行它,而不是创建一个单独的可执行文件并运行它?

秒表方法

其他答案中描述的秒表方法是一种更好,更精确的方法,上述方法只是在调试时输出数据的快捷方式。

这是使用Microsoft MSDN documentation

中的StopWatch类的示例
using System;
using System.Diagnostics;
using System.Threading;
class Program
{
    static void Main(string[] args)
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        Thread.Sleep(10000);
        stopWatch.Stop();
        // Get the elapsed time as a TimeSpan value.
        TimeSpan ts = stopWatch.Elapsed;

        // Format and display the TimeSpan value.
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);
        Console.WriteLine("RunTime " + elapsedTime);
    }
}

您只需调整上面的代码即可运行这两个函数并测量每个函数的运行时间。

获得一致且可重复的测量的重要说明

上面提到的MSDN文档说明如下:

  

在多处理器计算机上,哪个处理器无关紧要   线程运行。但是,由于BIOS或硬件中的错误   抽象层(HAL),您可以获得不同的计时结果   不同处理器。要指定线程的处理器关联,请使用   ProcessThread.ProcessorAffinity方法。

This article提供了一个示例,说明如何查看这些问题以及处理准确性问题的潜在方法。它开始于:

  

每个进行性能优化的人迟早都会遇到困难   在System.Diagnostics命名空间中的Stopwatch类。和   每个人都注意到了相同功能的测量   同一台计算机的运行时间可能相差25%-30%。这篇文章说明   如何设计单线程测试程序以获得准确性   秒表类的0.1% - 0.2%。有了这个准确性,   算法可以进行测试和比较。

如果您需要非常精确的测量,那么理解该文档中讨论的概念非常重要,这些概念涉及隔离线程以供您的功能使用,并在测试中加入预热阶段。

无论您使用哪种编程方法记录时间,这些要点都适用。

答案 3 :(得分:1)

如果您想分析代码以找到一些持久的方法和函数,请尝试dotTrace from Jetbrains或其他一些分析工具。

在dotTrace中,您可以非常快速地找到所有热点或潜在的瓶颈。 enter image description here

答案 4 :(得分:0)