【问题标题】:C# stop watch showing random timesC#秒表显示随机时间
【发布时间】:2017-08-09 01:33:52
【问题描述】:

我正在尝试计算运行一段代码所花费的时间。当我运行应用程序时,它会在每次执行时显示随机时间。这可能是什么问题?

var myTimer = Stopwatch.StartNew();

for(int i = 0; i < 10000; i++)
{
    Console.WriteLine("Hello Boss !");
}

myTimer.Stop();

Console.WriteLine(myTimer.ElapsedMilliseconds);
Console.ReadLine();

【问题讨论】:

  • 尝试更大的样本量。
  • 当您说“随机”时间时,您的真正意思是“值不相同的时间”,对吧?它很可能与您的环境中发生的其他事情有关。还有一个真的要测量的小循环。
  • 你的意思是这甚至考虑了代码执行时间之外的环境时间。
  • 是的,第一次迭代也有“热身”时间。当我在循环中运行您的代码 30 次时,第一次花费了 3804 毫秒,其余时间在 145169 毫秒之间。

标签: c# stopwatch


【解决方案1】:

两件事:

1.- 您的代码没有问题,但我会像这样使用它:

var stopwatch = new Stopwatch();
stopwatch.Start();
//// YOUR LOOP OR CODE GOES HERE
stopwatch.Stop();
elapsedTime = stopwatch.ElapsedMilliseconds;
Console.WriteLine($"YOUR LOOP OR CODE took {elapsedTime} ms");

如果你想重复使用秒表,你必须重置它:

 stopwatch.Reset();

就在重新开始之前。

2nd.- 执行时间(对于您计算机上的每个软件,不仅是此代码)取决于您的机器工作负载,考虑资源(处理器和磁盘)是共享的,是确定进程优先级和线程管理的操作系统以及诸如此类的东西,因此,对于不同的执行,您将不会获得相同的值。

【讨论】:

    【解决方案2】:

    for循环迭代的执行高度依赖于机器资源。 根据资源可用性,执行时间会不时变化。

    如果您担心测试秒表,请尝试以下代码 :) 当然,大多数时候你会得到一个恒定的结果。

                var myTimer = Stopwatch.StartNew();
    
                Thread.Sleep(10000);
    
                myTimer.Stop();
    
                Console.WriteLine(myTimer.ElapsedMilliseconds);
                Console.ReadLine();
    

    【讨论】:

    • 实际上,即使那样,您也会得到不一致的结果。我在循环中运行了 30 次(使用 1000 进行睡眠),结果介于:1000 到 1009 毫秒之间!
    • 是的,同意。因为线程可以休眠1000ms,不会立即启动,所以会是1000ms+微秒
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多