2010-02-20 11 views
2

В C# .NET, какой самый быстрый способ инициализировать массив удвоений для NaN?Каков самый быстрый способ инициализации всех элементов массива в NaN?

Вот как я сейчас инициализирую массив множеством элементов.

int length = array.Length; 
for(int i = 0; i < length; i++) 
{ 
    array[i] = double.NaN; 
} 

Есть ли более быстрый способ?

+0

Мне нравится "Enumerable.Repeat (defaulValue, arrayLength) .ToArray() (доступен с .NET 3.5) – Philippe

ответ

1

Вы можете использовать многопоточность, но это проблема O (N).

2

Заполнение массива байтовыми значениями 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); 
} 
+0

I * действительно * хотел было встроенный метод в C#, который испускал код операции initblk или, по крайней мере, статический метод в mscorlib, который JIT знал всегда, рассматривая как инструкцию initblk. –

+0

Вы запустили этот код? Не забудьте использовать сборку Release и не запускаться в отладчике. Переключение двух разделов оказало очень интересное воздействие на мою машину. –

+0

Было ли это направлено ко мне? Я просто сказал, что «initblk» - это код операции CIL, который эффективно «memset», за исключением того, что он избегает P/Invoke и, вероятно, сильно оптимизирован в CLR. –

Смежные вопросы