3

プログラムのすべてのポイントを最適化する必要はないことを理解しています。配列の初期化を最適化する必要があると仮定しましょう。

だから私は比較するプログラムを書きましfor loopArray.Clear

using System;
using System.Diagnostics;

namespace TestArraysClear
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] a = new int[100000];
            Stopwatch sw = Stopwatch.StartNew();
            for (int i = 0; i < 10; i++)
            {
                sw.Reset(); 
                sw.Start();
                for (int j = 0; j < a.Length; j++)
                {
                    a[j] = 0;
                }
                sw.Stop();
                Console.WriteLine("for " + sw.ElapsedTicks);
                sw.Reset();
                sw.Start();
                Array.Clear(a, 0, a.Length);
                sw.Stop();
                Console.WriteLine("Array.Clear " + sw.ElapsedTicks);
            }
        }
    }
}

私のマシンでの出力:

for 1166
Array.Clear 80
for 1136
Array.Clear 91
for 1350
Array.Clear 71
for 1028
Array.Clear 72
for 962
Array.Clear 54
for 1185
Array.Clear 46
for 962
Array.Clear 55
for 1091
Array.Clear 55
for 988
Array.Clear 54
for 1046
Array.Clear 55

つまりArray.Clear、の約20倍の速度ですfor loop。ただし、Array.Clearに初期化され0ます。-1どういうわけか同じパフォーマンスで配列を初期化できますか?

upd:「極端に危険な」コードを探していません。私はと同じくらい簡単なものを探していArray.Clearます。.NETは高速0初期化を提供しているのだろうかと思いますが、.NETは他の値への初期化を提供していません。では、なぜ.NETは「-1」よりも「0」の方がはるかに好きなのでしょうか。

upd既存のアレイをリセットしたい。だから私はArray.Clear配列をリセットするの-1ではなく、にリセットするアナログを探しています0

4

4 に答える 4

6

おそらく、アンマネージ配列(ポインター)を介して、連続するメモリブロックを同じ値に設定する方法があります(たとえば、4バイトのメモリにマップされたときのint'-1'は何でも)。

この記事では、マネージドforループよりも高速な方法について説明します(例はbyte []配列です): http ://techmikael.blogspot.com/2009/12/filling-array-with-default-value.html

また、ここで: C#のmemsetに相当するものは何ですか?

他のポスターが述べているように、これを行うのは少し極端に思えますが、通常、forループを使用して配列を初期化するのに必要な速度は問題になりません。

于 2012-05-19T06:44:23.373 に答える
2

高速かどうかはわかりませんが、配列を初期化するためのよりクリーンな方法です。

int[] a = Enumerable.Range(0, 100000).Select(s => -1).ToArray();

更新: またはより正確には

int[] a = Enumerable.Repeat(-1, 100000).ToArray();
于 2012-05-19T08:03:28.113 に答える
2

さて、最速の方法は静的初期化を使用することです:

int[] a = {-1, -1, -1, -1, ...}

あなたはいつでもあなたのためにそのためのソースコードを生成するプログラムを書くことができます、例えば

var sb = new StringBuilder("int[] a = {");
for (int i = 0; i < 10000; ++i)
    sb.append(i != 10000 -1 ? "-1," : "-1");
sb.append("};");
于 2012-05-19T06:10:34.863 に答える
0

そのようなことはありません-この質問これを参照してください。

クレイジー理論-Clear()そのメソッドが非マネージコードで実装されている場合は、配列の方が高速になる可能性があります。ただし、より大きなサンプルサイズに関する@JeffMercadoのコメントに注意してください。

于 2012-05-19T06:10:46.437 に答える