パフォーマンスを向上させようとしている小さなプログラムがあります。プログラムは非常に単純で、主に単一の再帰関数に基づいています。ただし、その背後にあるデータセットは非常に大きく、6,000,000,000 回の再帰が必要で、マシンによっては実行に約 4 ~ 6 時間かかります。データを処理するだけの I/O はありません。コードの最適化にかなりの時間を費やし、最大 60% の改善を見つけることができました。
ここで注目したいのは、コードをマルチスレッド化して、ホスト マシンのすべてのコアを活用することです。ただし、スレッド、タスク、および Parallel ライブラリの一部を使用してみましたが、パフォーマンスに悪影響を及ぼさないものを見つけることができませんでした。
私が見ているコードの種類のアイデアを提供するために:
class Program
{
static void Main(string[] args)
{
RecursiveFunction(0);
Console.ReadLine();
}
static void RecursiveFunction(int currentLevel)
{
DoWork(currentLevel);
if (currentLevel < 1000)
for (int i = 0; i < (currentLevel % 6) + 1; i++)
RecursiveFunction(currentLevel + 1);
}
static void DoWork(int currentLevel)
{
Thread.Sleep(42);
}
}
ご覧のとおり、関数の各実行の実行には時間がかからないため、再帰ごとにスレッドを作成するコストはそれほど価値がありません。再帰の各分岐の長さが異なる可能性があり、各分岐の長さを知る方法がないため、特定のレベルでのスレッド化は正しい方法ではありません。
誰か提案はありますか?