C# 如何计算函数执行所需的时间?

C# 如何计算函数执行所需的时间?,c#,C#,我有一个项目,我写了代码,用两个不同的公式计算相关系数 我应该计算每个公式产生输出所需的时间,然后比较这些时间以确定哪个更快 我该怎么做?我可以在同一个项目中使用,还是必须在不同的项目中分别使用公式?快速而肮脏的方法 在最简单的级别上,您可以在每个函数的开始和结束处将当前时间输出到VisualStudio中的即时窗口,然后比较这些值 如果在函数启动前添加此项: Debug.WriteLine("Function X started at: " + DateTime.Now.ToLongTimeS

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

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

我该怎么做?我可以在同一个项目中使用,还是必须在不同的项目中分别使用公式?

快速而肮脏的方法 在最简单的级别上,您可以在每个函数的开始和结束处将当前时间输出到VisualStudio中的即时窗口,然后比较这些值

如果在函数启动前添加此项:

Debug.WriteLine("Function X started at: " + DateTime.Now.ToLongTimeString());
在函数完成后:

Debug.WriteLine("Function X ended at: " + DateTime.Now.ToLongTimeString());
这将写入即时窗口。我假设您只是在VisualStudio中以调试模式运行它,而不是创建一个单独的可执行文件并运行它

秒表进近 其他答案中描述的秒表方法是一种更好、更精确的方法,上面的方法只是在调试时输出数据的一种快速而肮脏的方法

这是一个使用StopWatch类的示例,该类来自:

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

关于获得一致和可重复测量的重要注意事项 上述MSDN文件说明了以下内容:

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

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

执行性能优化的每个人迟早都会失败 在System.Diagnostics命名空间中的Stopwatch类上。和 每个人都注意到,相同函数的测量 同一台计算机的运行时间可能相差25%-30%。本文显示 如何设计单线程测试程序以获得准确度 0.1%-0.2%的秒表等级。以这样的准确度,, 算法可以测试和比较

如果您需要一个非常精确的测量,那么理解该文档中讨论的与隔离线程以供您的函数使用以及在测试中合并预热阶段相关的概念是很重要的


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

您可以使用类测量方法执行所需的时间


您可以使用秒表测量函数中经过的时间

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);
}
}
你可以使用class


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


在dotTrace中,您可以非常快速地找到所有热点或潜在瓶颈

听起来秒表类正是你想要的。海森堡的不确定性原理也适用于编码:你还应该比较两个公式的结果,以防其中一个有一些精度问题,这将是很重要的。如果它们没有太大差异,也不重要,你可能不需要担心。这是一段时间过去了,不是运行时。如何将时间输出到控制台?@AyaBadawi在Visual StudioDateTime中添加到即时窗口的代码与秒表的感知水平不同,这就是为什么使用秒表更好的原因。我完全同意@juharr,我已更新了我的答案以反映这一点。在不知道函数可能在几秒钟或几天内运行的情况下,很难评估所需的精度水平。@juharr你的评论让我想到了秒表精度,并让我找到了一篇有趣的文章,我在答案中添加了这篇文章;值得一读。
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();

CalculateStuff();
stopWatch.Stop();

// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
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);
}
}