Почему я загуглить вообще не могу причину. Это же наверное должна быть известная проблема. (либо у меня ошибка не в этом)
Как работает кеш-линия исполняемого кода, есть ли тонкости, вообще загуглить не могу, Но упал перфоманс в 100 раз в легчайшем примере. В 100, не в2,не в 3, а 100, раз из-за ОДНОГО или двух трех лишних nop?
Пока проверял 100 гипотез, на 123 гипотезе обнаружил, или догадка еще, что если данные для записи находятся в той же кеш линии, что и исполняемый код, то в 100 раз скорость падает.(или 100 нс добавляется на бенмаркинге)
допустим есть такая функция, ее размер 0x36=54 байта
int nativePrefixSum(int n)
{
var arr1 = _arr1;
var arr2 = _arr2;
int sum = 0;
for (int i = 0; i < n; i++)
{
sum += arr1[i];
arr2[i] = sum;
}
return sum;
}
ее размер машиного кода допустим 0x36=54 байта. Размер кеш линии процессора 64 вроде.
Теперь главное. представление кода Будет такое, Что Код И данные идут сразу после друг друга, код, массив для чтения, массив для записи(массив записи влезает в 2-6 байтами 64 границы).(изначально было выравние по 16 байт, но добалвением x-nop оказалось оно не работает, а вот по 64 исправляет полностью все, но это я с 123 раза обнаружил)
Если создать эту функцию для массива длинной 1-2, к примеру, то есть массив чтения будет 56-62 байт, массив записи 62-70 байт, и запустить ее от 1-2 аргумента(то есть фактически 1 итерация цикла) То перфоменс в 100 раз падает, при этом если создать массивы длинной допустим 1000, и запустить от аргумента 2, то скорость выполнения нормальная. так же если подальше разместить массив для записи, то все норм.
Отсюда вывод, что если происходит запись в исполняемую кеш-линию, то добавляется 100 наносекунд, и под 50-100 раз падает скорость . И я не могу загуглить почему так.