私はしばらくの間、128000x128000 ピクセルのような迷路を生成できる C# 迷路ジェネレーターに取り組んできました。すべてのメモリ使用量は既に最適化されているため、現在、生成の高速化を検討しています。
私が見つけた問題(興味のある点からはかなり外れています)は次のとおりです(問題を説明するためのサンプルコードにすぎません):
このコードは、pixelChanged が null の場合、私のマシンで約 1.4 秒で実行されます。
public void Go()
{
for (int i = 0; i < bitjes.Length; i++)
{
BitArray curArray = bitjes[i];
for (int y = 0; y < curArray.Length; y++)
{
curArray[y] = !curArray[y];
GoDrawPixel(i, y, false);
}
}
}
public void GoDrawPixel(int i, int y, Boolean enabled)
{
if (pixelChanged != null)
{
pixelChanged.Invoke(new PixelChangedEventArgs(i, y, enabled));
}
}
次のコードが実際に 0.4 秒速く実行される場所
public void Go()
{
for (int i = 0; i < bitjes.Length; i++)
{
BitArray curArray = bitjes[i];
for (int y = 0; y < curArray.Length; y++)
{
curArray[y] = !curArray[y];
if (pixelChanged != null)
{
pixelChanged.Invoke(new PixelChangedEventArgs(i, y, false));
}
}
}
}
「空の」メソッドを呼び出すだけで、このアルゴリズムが使用する CPU の約 20% を使用しているようです。これは奇妙ではありませんか?ソリューションをデバッグおよびリリース モードでコンパイルしようとしましたが、顕著な違いは見つかりませんでした。
これが意味することは、このループでメソッドを呼び出すたびに、コードが約 0.4 秒遅くなるということです。迷路ジェネレーターのコードは現在、さまざまなアクションを実行する多くの個別のメソッド呼び出しで構成されているため、これはかなりの量を取得し始めています。
また、スタック オーバーフローに関する Google や他の投稿も確認しましたが、まだ解決策は見つかりませんでした。
このようなコードを自動的に最適化することは可能ですか? (たぶん、プロジェクト Roslyn のようなものでしょうか???) それとも、すべてを 1 つの大きなメソッドにまとめる必要がありますか?
編集:これら2つのケースでのJIT/CLRコードの違いに関する分析にも興味があります。(この問題が実際にどこから来るのか)
Edit2: すべてのコードはリリース モードでコンパイルされました