5

過去数か月間、私は C# で記述した Zeros6 というプロセッサ集約型プログラムを実行してきました。

これまでのおおよその経過時間は 157 日で、合計プロセッサー時間は 1,217 日です。[コンピュータの詳細: Intel Core i7 2600 / 3.4 GHz / 4 コア + ハイパースレッディング -> 8 プロセッサ]

Visual Studio Express 2010 とバージョン 4 の .NET Framework を使用してプログラムを作成しました (と思います)。

とにかく、今日は Visual Studio Express 2012 をインストールすることにしました。インストーラーはバージョン 4.5 の .NET Framework をインストールし、インストールを続行するために再起動を要求しました。Zeros6 プログラムを停止し、再起動を OK しました。再起動後、通常どおり Zeros6 が自動的に再起動し、Visual Studio のインストールが続行され、すぐに終了しました。その後、Zeros6 が通常よりもはるかに高速に実行されていることを発見してショックを受けました。通常は 5.5 (1 桁あたりのピコ秒) でかなり安定している速度インジケーターが 2.0 に低下しました。その後、プログラムの停止と開始を数回繰り返し、コンピューターを再起動しましたが、速度の向上は持続しています。古い速度を 100% とすると、新しい速度は 275% です!!

何が起こっているのか知りたいです。

いくつかの宣言...

uint[] digits;  
uint   startI;  
uint   stopI;  
public static readonly int  bigPowerIncrement = 34;  
public static readonly uint myBase = 1000000000;  

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;
  }
4

1 に答える 1

2

何が改善されたかを正確に知ることは困難ですが、.NET 4.5 にはかなりの数の改善がありました。これは .NET 4 へのインプレース アップグレードであるため、これらの改善の恩恵を受けることができます。

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

たとえばh.specialsが の場合ConcurrentDictionary<T,U>、これだけでも改善される可能性があります。このConcurrentDictionary<T,U>型は、.NET 4.5 で劇的に改善されました。

また、以前にはなかった新しいまたは変更された JIT 最適化の 1 つ、または他の多くの利点が得られる可能性もあります。

于 2012-09-17T23:09:37.443 に答える