这是检查在C#中运行某些代码所花费的时间的好方法吗?

Met*_*uru 5 c# datetime

我的意思是...

得到时间,运行代码,获取时间,比较时间并获得秒数:

我这样做对吗?

DateTime timestamp = DateTime.Now;
//...do the code...
DateTime endstamp = DateTime.Now;

string results = ((endstamp.ticks - timestamp.ticks)/10000000).ToString();
Run Code Online (Sandbox Code Playgroud)

Nic*_*ver 13

你应该使用秒表,例如:

var sw = Stopwatch.StartNew();
//...do the code...
sw.Stop();
var result = sw.ElapsedTicks; //ticks it took
//or less accurate/for bigger tasks, sw.ElapsedMilliseconds
Run Code Online (Sandbox Code Playgroud)

编辑,包括@ 布莱恩从评论的改善.

  • +1.一个捷径是:`var sw = Stopwatch.StartNew();`它只将前两行合并为一行.此外,除非花费数小时的时间,否则我更喜欢"sw.ElapsedMilliseconds",因为它对我而言比蜱更重要. (5认同)

Eri*_*ert 11

正如许多人所指出的那样,高精度秒表课程旨在回答"这需要多长时间?"的问题.而DateTime课程则用于回答"Doctor Who何时开始?"的问题.使用正确的工具完成工作.

然而,正确测量经过时间的问题不仅仅是简单地使计时器正确.你还必须确保测量你真正想测量的东西.例如,考虑:

// start the timer
M();
// stop the timer
// start another timer
M();
// stop the timer
Run Code Online (Sandbox Code Playgroud)

这两个电话的时间之间是否会有显着差异?可能是的.请记住,第一次调用方法时,抖动必须将其从IL编译为机器代码.这需要时间.对某个方法的第一次调用在某些情况下可能比放在一起的每个后续调用长很多.

那么哪种测量是"正确的"?第一次测量?第二?他们的平均值?这取决于您要优化的内容.如果您正在优化快速启动,那么您非常关心jit时间.如果您在热身服务器上优化每秒服务的相同页面的数量,那么您根本不关心jit时间,应该设计您的测试以测量它.确保您正在测量您实际优化的东西.


Ant*_*ram 6

不.请改用System.Diagnostics.Stopwatch班级.DateTime.Now没有你想要的精度水平(尽管DateTime结构本身就很精确).

Stopwatch watch = new Stopwatch();
watch.Start();
// do stuff
watch.Stop();
long ticks = watch.ElapsedTicks;
Run Code Online (Sandbox Code Playgroud)

  • 实际上,DateTime有很多*精度*但它没有相应的*精度*.有关这方面的一些想法,请参见http://blogs.msdn.com/b/ericlippert/archive/2010/04/08/precision-and-accuracy-of-datetime.aspx. (4认同)