更新-ファセットな心構えの人にとっては、最適化されている場合を含め、Aggregateに渡された関数が何であれ、Aggregateは引き続き通常の結果を生成すると想定できます。
このプログラムは、0から19999までの整数の長い文字列をコンマで区切って作成するために作成しました。
using System;
using System.Linq;
using System.Diagnostics;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
const int size = 20000;
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Enumerable.Range(0, size).Select(n => n.ToString()).Aggregate((a, b) => a + ", " + b);
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds + "ms");
}
}
}
私がそれを実行すると、それは言います:
5116ms
5秒以上、ひどい。もちろん、それは文字列全体がループの周りで毎回コピーされているためです。
しかし、コメントで示されている非常に小さな変更を1つ行うとどうなりますか?
using System;
using System.Linq;
using System.Diagnostics;
namespace ConsoleApplication5
{
using MakeAggregateGoFaster; // <---- inserted this
class Program
{
static void Main(string[] args)
{
const int size = 20000;
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Enumerable.Range(0, size).Select(n => n.ToString()).Aggregate((a, b) => a + ", " + b);
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds + "ms");
}
}
}
今私がそれを実行すると、それは言います:
42ms
100倍以上高速です。
質問
MakeAggregateGoFaster名前空間には何が含まれていますか?
更新2: ここに私の答えを書きました。