使用System.Diagnostics.Stopwatch对程序的运行时间精确地测量

介绍

每个使用System.Diagnostics命名空间下的Stopwatch类做性能优化的人迟早会遇到一些麻烦。每个人都可以看到了,在同一台电脑相同功能的测试在运行时间上会有25% -30%不同。本文介绍如何使用Stopwatch类设计单线程测试程序获得0.1% - 0.2%准确性。有了这个精度,算法才可以进行测试和比较。

背景

现代CPU有多个内核,大容量高速缓存,指令管道和许多其他的东西影响特定测试场景一个算法的运行 时间。白盒测试技术-如附加的调试器或者分析器-关闭 CPU的高速缓存线路,管道等。真正的运行时间是 隐藏的,这样这些现代超标量处理器优化的计算方法执行速度要比使用分析器的没有优化的还要慢(由于 更多的指令)。黑盒测试没有附加的调试器或分析器(运行时间测量),能发现算法的实际性能,并完成 了算法的性能分析。

设置测试方案

最重要的是防止CPU内核或处理器之间的切换。对性能测试有很大的影响。这可以通过设置进程的 ProcessorAffinity来实现:

Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(2); // Use only the  second core

为了能独占CPU内核,我们必须防止其他线程可以使用此CPU内核。我们设置进程和线程的优先级,来 实现这一目标:

Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;

Thread.CurrentThread.Priority = ThreadPriority.Highest;

最后,但并非不重要的,在我们的测试需要热身阶段。在我的系统中,1000-1500毫秒热身阶段之后结 果是稳定的。我们可以用stopwatch自己来控制热身(这里至少1200mS):

stopwatch.Start();
while (stopwatch.ElapsedMilliseconds < 1200)
{
     result = TestFunction(seed, count);
}
stopwatch.Stop();

时间: 2024-08-03 22:57:54

使用System.Diagnostics.Stopwatch对程序的运行时间精确地测量的相关文章

用System.Diagnostics.Process .start()启动本地客户端程序,怎样把网页上的数据作为参数传给本地客户端程序??高手帮忙!!!!

问题描述 用System.Diagnostics.Process.start()启动本地客户端程序,代码如下:stringLocalPath="C:\ProgramFiles\LiveLearning\Bin\LiveClient.exe";if(System.IO.File.Exists(LocalPath)){System.Diagnostics.Processproc1=newSystem.Diagnostics.Process();proc1.StartInfo.FileNam

System.Diagnostics命名空间里的Debug类和Trace类的用途

debug|命名空间 摘要 在 .NET 类库中有一个 System.Diagnostics 命名空间,该命名空间提供了一些与系统进程.事件日志.和性能计数器进行交互的类库.当中包括了两个对开发人员而言十分有用的类--Debug类和Trace类.本文介绍了这两个类的一些基本用途,旨在提高广大开发人员的开发效率.使用Debug类来帮助调试 调试程序对每个程序员来说是家常便饭.可是我们会经常遇到一些情况让我们头疼,例如: 当我们在开发一个界面控件的时候,简单的设断点会增加Paint事件的响应次数,而

System.Diagnostics.Process.Start()问题分享

问题描述 今天接到用户电话说预览不了文件,调试代码发现预览附件的代码System.Diagnostics.Process.Start(app.path+"a.tif")在本机能成功预览.别的机器上运行该程式也能成功预览.本人觉得郁闷.用户说好急,没办法,只好到现场去看看,把客户端的文件路径找到后,直接在运行里面输入绝对路径按回车,弹出了windows的打开方式窗口,OMG,原来是操作系统没有默认打开程式, 解决方案 解决方案二:学习了解决方案三:学习学习!!感谢楼主分享.解决方案四:感

System.Diagnostics命名空间里的Debug类和Trace类的用途【转】

在 .NET 类库中有一个 System.Diagnostics命名空间,该命名空间提供了一些与系统进程.事件日志.和性能计数器进行交互的类库.当中包括了两个对开发人员而言十分有用的类Debug类和Trace类.本文介绍了这两个类的一些基本用途,旨在提高广大开发人员的开发效率. 目录 使用Debug类来帮助调试 Debug类和Trace类的区别 使用Trace类来做程序日志 小结 参考资料 使用Debug类来帮助调试 调试程序对每个程序员来说是家常便饭.可是我们会经常遇到一些情况让我们头疼,例如

System.Diagnostics命名空间里的“.NET研究”Debug类和Trace类的用途【转】

在 .NET 类库中有一个 System.Diagnostics命名空间,该命名空间提供了一些与系统进程.事件日志.和性能计数器进行交互的类库.当中包括了两个对开发人员而言十分有用的类Debug类和Trace类.本文介绍了这两个类的一些基本用途,旨在提高广大开发人员的开发效率. 目录 使用Debug类来帮助调试 Debug类和Trace类的区别 使用Trace类来做程序日志 小结 参考资料 使用Debug类来帮助调试 调试程序对每个程序员来说是家常便饭.可是我们会经常遇到一些情况让我们头疼,例如

一起谈.NET技术,System.Diagnostics命名空间里的Debug类和Trace类的用途【转】

在 .NET 类库中有一个 System.Diagnostics命名空间,该命名空间提供了一些与系统进程.事件日志.和性能计数器进行交互的类库.当中包括了两个对开发人员而言十分有用的类Debug类和Trace类.本文介绍了这两个类的一些基本用途,旨在提高广大开发人员的开发效率. 目录 使用Debug类来帮助调试 Debug类和Trace类的区别 使用Trace类来做程序日志 小结 参考资料 使用Debug类来帮助调试 调试程序对每个程序员来说是家常便饭.可是我们会经常遇到一些情况让我们头疼,例如

c++-能问下我的这个程序为什么运行时间超出了么(关于把一串字符位置颠倒)

问题描述 能问下我的这个程序为什么运行时间超出了么(关于把一串字符位置颠倒) #include #include #include using namespace std; int main() { char c[300],a[300]; int b,d=0; int i,k,j,t,len; cin>>b; getchar();//将回车键拿掉 while(b--) { gets(c) ; len=strlen(c); for(i=0,j=0,t=0;i { if(c[i]!=' ')a[j

System.Diagnostics.Process.Start打开文件失败

问题描述 打开VS后,如果我开的网站里的档案系统,就可以打开文件,如果我当打开的是本机IIS就不能打开,但是不会出错,页面闪一下就没了.我的代码是这么写的:System.Diagnostics.Process.Start(strPageValue);strPageValue是我获得的文件路径.其格式就是c:\FEM\Vaults\新建.txt在档案系统里能正常打开,但是如果打开本机IIS就不行,各位大侠帮我看一看,这到底是什么原因呢,或者有没有别的方法可以打开本地文件的 解决方案 解决方案二:余

异常详细信息: System.InvalidOperationException: 在应用程序配置中未找到连接名“testConnectionString3”或者连接字符串为空。

问题描述 大家好,小弟在用asp.net时遇到以下问题:向页面增加一个DropDownList控件时,使用数据绑定连接到数据库,在vs2005测试中能够顺利进行,但是发布到iis上,就不能运行.报错:"/test"应用程序中的服务器错误.--------------------------------------------------------------------------------在应用程序配置中未找到连接名"testConnectionString3"