посмотрите на эти 2 цикла
const int arrayLength = ...
Версия 0
public void RunTestFrom0()
{
int sum = 0;
for (int i = 0; i < arrayLength; i++)
for (int j = 0; j < arrayLength; j++)
for (int k = 0; k < arrayLength; k++)
for (int l = 0; l < arrayLength; l++)
for (int m = 0; m < arrayLength; m++)
{
sum += myArray[i][j][k][l][m];
}
}
Версия 1
public void RunTestFrom1()
{
int sum = 0;
for (int i = 1; i < arrayLength; i++)
for (int j = 1; j < arrayLength; j++)
for (int k = 1; k < arrayLength; k++)
for (int l = 1; l < arrayLength; l++)
for (int m = 1; m < arrayLength; m++)
{
sum += myArray[i][j][k][l][m];
}
}
Версия 2
public void RunTestFrom2()
{
int sum = 0;
for (int i = 2; i < arrayLength; i++)
for (int j = 2; j < arrayLength; j++)
for (int k = 2; k < arrayLength; k++)
for (int l = 2; l < arrayLength; l++)
for (int m = 2; m < arrayLength; m++)
{
sum += myArray[i][j][k][l][m];
}
}
Результаты для arrayLength=50
(в среднем по множественной выборке, скомпилированной в X64):
- Версия 0: 0.998s (стандартная ошибка средних 0.001s): общее число циклов: 312500000
- Версия 1:1.449s (стандартная ошибка средних 0.000s) общих циклов: 282475249
- Версия 2: 0.774s (стандартная ошибка средних 0.006s) общих циклов: 254803968
- Версия 3: 1.183s (стандартная ошибка средних 0.001s) общих циклов: 229345007
если мы сделаем arrayLength=45
, тогда
- Версия 0: 0.495s (стандартная ошибка средних 0.003s) полных циклов: 184528125
- Версия 1: 0.527s (стандартная ошибка средних 0.001s): общее число циклов: 164916224
- Версия 2: 0.752s (стандартная ошибка средних 0.001s): общее число циклов: 147008443
- Версия 3: 0.356s (стандартная ошибка средних 0.000s) общих циклов: 130691232
почему:
- начало цикла с 0 быстрее, чем запуск цикла с 1, хотя больше циклов
- почему цикл начинается с 2 ведет себя странно?
Обновление:
- Каждый раз я запускал 10 раз (что означает стандартная ошибка среднего)
- Я также дважды менял порядок тестов версий. Нет большой разницы.
- Длина
myArray
каждого измерения =arrayLength
, я инициализировал его в начале и исключенное время исключено. Значение равно 1. Таким образом,sum
дает полные циклы. - Выполненная версия - это режим Release, и я запускаю ее из стороннего VS. (Закрыто VS)
Update2:
Теперь я полностью отбрасываю myArray
, sum++
и добавляет GC.Collect()
public void RunTestConstStartConstEnd()
{
int sum = 0;
for (int i = constStart; i < constEnd; i++)
for (int j = constStart; j < constEnd; j++)
for (int k = constStart; k < constEnd; k++)
for (int l = constStart; l < constEnd; l++)
for (int m = constStart; m < constEnd; m++)
{
sum++;
}
}