.NET Framework 4.5上的意外加速

Cli*_*oth 5 .net c#

在过去的几个月里,我一直在运行一个处理器密集型程序,我在C#中编写了一个名为Zeros6的程序.

到目前为止,大约经过的时间为157天,处理器总时间为1,217天.[计算机的一些细节:英特尔酷睿i7 2600/3.4 GHz/4内核+超线程 - > 8个处理器.

我使用Visual Studio Express 2010和.NET Framework的第4版(我认为)编写了程序.

无论如何,今天我决定安装Visual Studio Express 2012.安装程序安装了.NET Framework 4.5版,然后请求重新启动以继续安装.我停止了Zeros6程序并确认重启.重启后,Zeros6像往常一样自动重启,Visual Studio安装继续,很快就完成了.然后我震惊地发现Zeros6的运行速度比通常运行的要快.速度指示器通常相当稳定在5.5(每个皮秒的皮秒数)已下降到2.0 - 我从未见过它低于5.34.然后我停下来并启动了几次程序,然后重新启动计算机,但速度的提高仍在继续.如果我们将旧速度称为100%,则新速度为275%!!

我很想知道发生了什么.

一些声明......

uint[] digits;  
uint   startI;  
uint   stopI;  
public static readonly int  bigPowerIncrement = 34;  
public static readonly uint myBase = 1000000000;  
Run Code Online (Sandbox Code Playgroud)

所有8个处理器大部分时间花在这上面......

  {
    ulong carry = 0;
    unchecked
    {
      for (uint i = startI; i < stopI; i++)
      {
        ulong m = ((ulong)digits[i] << bigPowerIncrement) | carry;
        carry = m/myBase;
        if ((digits[i] = (uint)(m - myBase*carry)) < 1000000)
        { // do this about one time in 1000...
          h.specials[h.specialCount++] = i;
        }
      } // i loop
    } // unchecked
    h.carry = carry;
  }
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 2

很难确切知道改进了什么,但 .NET 4.5 中有相当多的改进。由于它是对 .NET 4 的就地升级,因此您将从这些改进中受益。

h.specials[h.specialCount++] = i;

例如,如果h.specialsConcurrentDictionary<T,U>,则仅此一项就可能是改进。该ConcurrentDictionary<T,U>类型在 .NET 4.5 中得到了显着改进。

它也可能只是一项新的或更改的 JIT 优化,现在使您受益匪浅,或者是许多其他事情。