Бенчмаркинг следующего на удивление дает лучшие результаты для управляемых массивов (на 10% быстрее, последовательно). Я тестирую в Unity, так что, возможно, это относится к Mono?C# (Mono), управляемый против неуправляемых массивов: управляемость эталоном?
unsafe void Bench()
{
//Locals
int i, j;
const int bufSize = 1024 * 1024;
const int numIterations = 1000;
const float gain = 1.6745f;
float[] managedBuffer;
IntPtr ptr;
float * unmanagedBuffer;
Stopwatch stopwatch;
// Allocations
managedBuffer = new float[ bufSize ];
for(i = 0; i < bufSize; i++)
{
managedBuffer[ i ] = UnityEngine.Random.value;
}
ptr = Marshal.AllocHGlobal(bufSize * sizeof(float));
unmanagedBuffer = (float *)ptr.ToPointer();
Marshal.Copy(managedBuffer, 0, ptr, bufSize);
stopwatch = new Stopwatch();
stopwatch.Start();
// Unmanaged array iterations
for(i = 0; i < numIterations; i++)
{
for(j = 0; j < bufSize; j++)
{
unmanagedBuffer[ j ] *= gain;
}
}
UnityEngine.Debug.Log(stopwatch.ElapsedMilliseconds);
stopwatch.Reset();
stopwatch.Start();
// Managed array iterations
for(i = 0; i < numIterations; i++)
{
for(j = 0; j < bufSize; j++)
{
managedBuffer[ j ] *= gain;
}
}
UnityEngine.Debug.Log(stopwatch.ElapsedMilliseconds);
Marshal.FreeHGlobal(ptr);
}
Я экспериментирую с небезопасным кодом для аудио приложения, которое является весьма критичным для производительности. Я надеюсь увеличить производительность и уменьшить/устранить сбор мусора.
Любое понимание оценено!
Бенчмаркинг является сложным искусство, легко сделать ошибки и заметны небольшие различия в машинных кодах. Различия менее 15% не являются статистически значимыми. Назовите этот код не менее 10 раз, ниже * numIterations *, так что вам не нужно так долго ждать. Обратите внимание на значительное изменение результатов. Когда я пытаюсь использовать .NET, код работает с одинаковой скоростью. Как это должно. –