Это будет работать быстрее, для небольших данных не стоит делать Parallel.For(0, count, (j) =>
На самом деле, оно работает намного медленнее для очень маленьких данных, поэтому я закомментировал этот раздел.
double* dp0;
float* fp0;
fixed (double* dp1 = dbl)
{
dp0 = dp1;
float[] newFlt = new float[count];
fixed (float* fp1 = newFlt)
{
fp0 = fp1;
for (int i = 0; i < numCh; i++)
{
//Parallel.For(0, count, (j) =>
for (int j = 0; j < count; j++)
{
fp0[j] = (float)dp0[i * count + j];
}
//});
flt[i] = newFlt.Clone() as float[];
}
}
}
Это работаетбыстрее, потому что двойной доступ к двойным массивам [,]
действительно обременителен в .NET из-за проверки границ массива.newFlt.Clone()
просто означает, что мы не исправляем и не фиксируем новые указатели все время (поскольку при этом возникают небольшие накладные расходы)
Вам нужно будет запустить его с тегом кода unsafe
и скомпилироватьс /UNSAFE
Но на самом деле вы должны работать с данными ближе к 5000 x 5000, а не к 5 x 2, если что-то занимает менее 1000 мс, вам нужно либо добавить больше циклов, либо увеличить данные, потому что при этомНебольшой всплеск активности процессора может добавить много шума вашему профилированию.