2009-10-15 63 views
1

我有一个C#应用程序,我正在测试3种方法来处理XML。程序执行速度测试

我读了一串XML获取一个值,然后将其添加到自定义集合中。

我正在测试XMLDocument,XDocument和字符串操作来查找节点值,按顺序记录每个节点的开始和结束时间。

但是,如果我说混合订单,我会得到不同的速度报告。另外,当我再次按下按钮再次执行测试时,最初速度最慢的测试有时在随后的测试中占用最少。

我确定它的所有内容都与JIT和垃圾收集有关,但确定最快运行速度的最真实的方法是什么?

我已经下载了EQATEC分析器,但是我失去了如何处理它。

有人可以告诉我最好的方法来确定什么方法运行最快。

感谢

回答

0

尝试使用像红门ANTSdotTrace从JetBrains的一个分析工具。分析器将显示每种方法花费的时间百分比,以便您确定哪种方法执行得更快。

+1

它必须是一个自由的恐惧。 – Jon 2009-10-15 11:19:24

+1

你可以随时使用试用版吗? – Kane 2009-10-15 12:28:15

1

对于具有一组采样输入的每种方法,在使用StopWatch来测量时间的情况下,它不够吗?

+0

多数民众赞成我所做的事情,但是如果我改变围绕ie/TestString,TestXdoc,TestXML的处理执行所需的时间是不同的,如果我运行TestXML,TestXDoc,TestString为什么? – Jon 2009-10-15 11:34:54

+0

你丢弃了第一个结果吗? – Simon 2009-10-15 11:51:52

+0

我猜想第一种方法最慢?您应该运行单独的测试,例如1000次带样本文件的TestXML,然后计算平均值。重复TestXDoc,然后使用TestString并比较结果。 – Philippe 2009-10-15 12:09:40

0

学会用你拥有的工具:

http://www.eqatec.com/tools/profiler/guide

如果您收到不一致的结果,做科学的事情,使控制情况:在

  • 要么多次测试因此第一种情况在其余运行
  • 之间取平均值或仅测试第一种情况(每次重新启动应用程序)。
0

您可以使用Michael McMillian的“Data structures and algorithms using c#”中的Timing类。

粗略这将是如下:

TimeSpan startingTime, duration; 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 
startingTime = Process.GetCurrentProcess().Threads[0].UserProcessorTime; 
DoLengthyWork(); 
duration = Process.GetCurrentProcess.Threads(0).UserProcessorTime.Subtract(startingTime); 
1

乔恩斯基特写测量这样简单的操作,一个相当不错的bechmarking“框架”,我觉得这是非常适合于检查每个这些方法,你可以在这里找到:http://www.yoda.arachsys.com/csharp/benchmark.html(注意,这只是对操作进行计时,而不是分析堆使用情况或类似的情况)。

需要牢记的一点很重要(乔恩在上面的网站上提到它,每当主题出现时,Eric Lippert都喜欢提及它)是当你多次运行代码时,它只会获得JIT'd第一次,所以如果你想测量每种方法的真实差异,至少测量两次,并比较第二次运行 - 我会想象这是你的转换命令的结果。