C# .NET で、double の配列を NaN に初期化する最速の方法は何ですか?
現在、多くの要素を持つ配列を初期化する方法を次に示します。
int length = array.Length;
for(int i = 0; i < length; i++)
{
array[i] = double.NaN;
}
もっと速い方法はありますか?
C# .NET で、double の配列を NaN に初期化する最速の方法は何ですか?
現在、多くの要素を持つ配列を初期化する方法を次に示します。
int length = array.Length;
for(int i = 0; i < length; i++)
{
array[i] = double.NaN;
}
もっと速い方法はありますか?
配列を0xffのバイト値で埋めると、NaNが生成されます。このコードを試して、マシンで最速のものを確認してください。Memset()は必ずしもスラムダンクではありません。
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
class Program {
static void Main(string[] args) {
var arr = new double[10 * 1024 * 1024];
for (int loop = 1; loop < 20; ++loop) {
var sw1 = Stopwatch.StartNew();
for (int ix = 0; ix < arr.Length; ++ix)
arr[ix] = double.NaN;
sw1.Stop();
var sw2 = Stopwatch.StartNew();
memset(arr, 0xff, 8 * arr.Length);
sw2.Stop();
Console.WriteLine("Loop: {0}, memset: {1}", sw1.ElapsedMilliseconds, sw2.ElapsedMilliseconds);
}
Console.ReadLine();
}
[DllImport("msvcrt.dll")]
private static extern void memset(double[] array, int value, int cnt);
}
マルチスレッド化できますが、それでも O(N) 問題です。