は、より効率的である:(ミリ秒単位で、それは+ -3ミリ秒差 - 微々たるものである。)
var watch = System.Diagnostics.Stopwatch.StartNew();
var stringArra1y = Enumerable.Range(0, 4).Select(i => string.Empty).ToArray();
watch.Stop();
Console.WriteLine(watch.ElapsedTicks); //3305
watch = System.Diagnostics.Stopwatch.StartNew();
var stringArray2 = new string[4];
for (int i = 0; i < stringArray2.Length; i++)
{
stringArray2[i] = string.Empty;
}
watch.Stop();
Console.WriteLine(watch.ElapsedTicks); //1
しかし、あなたの代わりにEnumerable.Range().Select
使用.Repeat
使用することができます
を
var watch = System.Diagnostics.Stopwatch.StartNew();
var stringArra1y = Enumerable.Repeat(string.Empty, 4).ToArray();
watch.Stop();
Console.WriteLine(watch.ElapsedTicks); //391
あなたがここでは非常に小さなコレクション(4アイテム)について話していると言った後。その後、私は、あるかもしれない
var watch = System.Diagnostics.Stopwatch.StartNew();
var stringArra1y = Enumerable.Repeat(string.Empty, 100000);
watch.Stop();
Console.WriteLine(watch.ElapsedTicks); //360
watch = System.Diagnostics.Stopwatch.StartNew();
var stringArray2 = new string[100000];
for (int i = 0; i < stringArray2.Length; i++)
{
stringArray2[i] = string.Empty;
}
watch.Stop();
Console.WriteLine(watch.ElapsedTicks); //1335
しかし、私は最後に選択して恐れる:あなたは.ToArray()
を削除する大規模コレクションで、特に場合は、それは同じように動作しません。 Reference Source両方.Range
とRepeat
を用いて実装されているものの効果、ループは二回
探しyield return
:
static IEnumerable<int> RangeIterator(int start, int count) {
for (int i = 0; i < count; i++) yield return start + i;
}
だから、それはあまりにもID defferedはちょうどそれが二回ループしないという意味.Select
のように、実行します。
はHESEマイナーなパフォーマンスの向上を超える読みやすくするために行かないStopwatch
リターンの使用は異なる結果各実行を全体的なアイデアは、特に小さなコレクションの場合には、
IMO上に提示されていること。あなたがすでにパフォーマンスの問題に遭遇したときは、より大きな魚を手に入れた後でのみ(たとえば、HashSet<>
を使用する代わりにループを入れてList<>
に入れます)、このようなものを処理します。ループのために1つの000 000文字列の38msにより高速であるように見える私の非常に簡単なテストで
[高速です](https://ericlippert.com/2012/12/17/performance-rant/)を知りたいときは、自分でテストしてください。 – juharr
第1の方法には、いくつかのオブジェクトのインスタンス化しかありません。 ToArrayが最大の犯人になるだろう。しかし、これはあなたが懸念しなければならないパフォーマンスの問題ではありません(通常)。これはミクロ最適化です。 –
@Dennis_Eそれは他の何よりも好奇心でした。助けてくれてありがとう – jolySoft