C ++ / CLI代码在循环内变慢

时间:2016-10-31 20:34:34

标签: performance c++-cli stopwatch

我正在使用Visual Studio 2015在C ++ / CLI中编写代码。

现在,我面临一个奇怪的问题。我的代码在循环内迭代时运行得更慢。我的代码在后台工作程序中运行,其内容如下:

for(Int32 d = 0; d < 365; d++){
  DoStuff1();
  DoStuff2();
  DoStuff3();
  DoStuff4();
}; 

as days&#34; d&#34;通过,代码运行较慢,即从一天开始需要更多时间&#34; d&#34;到了一天&#34; d + 1&#34;。 我试图通过使用StopWatch类来找到问题的根源&#39;每个DoStuff方法。我是这样做的:

timeOperations->StartNew;
DoStuff1();
timeOperations->Stop();                     
milliSec = timeOperations->ElapsedMilliseconds; 
Print(milliSec); 

通过查看每个DoStuff方法的毫秒数,我可以看到计算时间不会随着日期的变化而变化。&#34; d&#34;迭代。也就是说,DoStuff1的计算时间在&#34; d = 0&#34;,&#34; d = 1&#34;,...,&#34; d = 70&#34;等等。其他DoStuff方法也会出现相同的模式,只有不同的计算时间。

除此之外,我还尝试将秒表包裹在所有DoStuff方法周围,如下所示:

for(Int32 d = 0; d < 365; d++){
  timeOperations->StartNew;
  DoStuff1();
  DoStuff2();
  DoStuff3();
  DoStuff4();
  timeOperations->Stop();                       
  milliSec = timeOperations->ElapsedMilliseconds; 
  Print(milliSec); 
}; 

这也导致每天的计算时间相同。尽管我可以清楚地看到代码变得越来越慢,因为白天&#34; d&#34;迭代。

我不知道发生了什么。我希望你们中的一些人之前已经解决了这个问题,并且可以给我一些提示。

我很欣赏如何解决这个问题。

提前致谢。

1 个答案:

答案 0 :(得分:1)

这里有两个问题:

  1. 您的代码在迭代时变得越来越慢。
  2. 您添加的计时代码显示每次迭代的相同结果。
  3. 在没有向我们展示确切代码或至少是时间数字的情况下诊断第一个很难,所以我们知道它会慢多少。但第二个我们可以提供帮助。

    你永远不会重新启动秒表。

    正如你现在所拥有的那样,你有一个你最初创建的秒表(在你没有显示的代码中的某个地方),你停止它,得到时间,但你再也不会启动它。这就是秒表显示相同结果的原因。

    StartNew是Stopwatch类的静态方法。你应该静态地调用它来创建和启动一个新的秒表。

    timeOperations = Stopwatch::StartNew();
    

    或者,您可以保留相同的秒表对象,并restart计时器。

    timeOperations->Restart();