Я писал несколько тестов бенчмаркинга, чтобы выяснить, почему подобный чистый алгоритм (не С++ lib/.net, построенный в классах) работал быстрее на С++, чем на С#, даже если учитывал ожидаемые отличия функций. И, делая это, я наткнулся на эти 2 теста, которые сбивали меня с толку, есть ли у кого-нибудь представление о том, почему он существенно медленнее, чем другой? Единственное отличие во втором (что занимает 51 мс против 88 на моей машине) состоит в том, что 2 массива объявляются локально в методе вместо внешнего. В обоих случаях массивы создаются до начала отсчета времени.
const int Runs = 100;
const int Width = 5000;
const int Height = 5000;
const int Size = Width * Height;
static int[] Input = Enumerable.Range(0, Size).ToArray();
static int[] Output = new int[Size * 2];
static int SimpleTest()
{
// Removing those 2 lines and using the static arrays instead give substantially slower performance, nearly half the speed!
int[] Input = Enumerable.Range(0, Size).ToArray();
int[] Output = new int[Size * 2];
Stopwatch sw = new Stopwatch();
sw.Start();
for (int run = 0; run < Runs; run++)
{
int InputIndex = 0;
for (int x = 0; x < Width; x++)
{
for (int y = 0; y < Height; y++)
{
int pixel = Input[InputIndex];
var OutputIndex = InputIndex * 2;
Output[OutputIndex] = pixel;
Output[OutputIndex + 1] = pixel;
InputIndex++;
}
}
}
sw.Stop();
return (int)(sw.ElapsedMilliseconds / Runs);
}