以下代码的结果不同如果它在后台启动调试器或没有调试器.如果开启优化,那么差异就在那里.
这是结果:
- >与优化:1000 2008 3016 1001 2009 3007 ...
- >无优化(如预期)1000 1008 1016 1001 1009 1017 ...
码:
using System; using System.Diagnostics; using System.Runtime.CompilerServices; namespace OptimizerTest { public class Test { int dummy; public void TestFunction(int stepWidth) // stepWidth must be a parameter { for (int step = 0; step < stepWidth; step++) { dummy = step + 1000; // addition with constant ( same value as later !) for (int x = 0; x < 20; x += stepWidth) { int index = x + 1000 + step; // constant must be same as above and ?!?! // int index = x + step + 1000; works !!!!! Console.Write("\n\r" + index); } } } [MethodImpl(MethodImplOptions.NoOptimization)] public void TestFunctionNoOptimization(int stepWidth) { for (int step = 0; step < stepWidth; step++) { dummy = step + 1000; for (int x = 0; x < 20; x += stepWidth) { int index = x + 1000 + step; Console.Write("\n\r" + index); } } } } class Program { ////// Result differs from Start with F5 to Ctrl-F5 /// /// static void Main(string[] args) { Test test = new Test(); Console.Write("\n\r---------\n\roptimized result\n\r-------------" ); test.TestFunction(8); Console.Write("\n\r---------\n\rnot optimized result\n\r-------------"); test.TestFunctionNoOptimization(8); Console.Write("\n\r---------\n\rpress any key"); Console.ReadKey(); } } }
错误的行为取决于内循环的迭代次数(x <5一切正常).非常有趣的是,当我使用时不会发生
int index = x + step + 1000;
代替
int index = x + 1000 + step;
我正在使用Visual Studio 2010 SP1并尝试使用.NET Framework从2.0到4.0.3.我总是看到同样的结果.
有人知道这个bug还是可以重现?