Я заметил это случайно однажды, и теперь решил тщательно его протестировать.Почему const int быстрее const int &?
Так что, когда я вызвать функцию:
#define Type int
#define Prm const Type &
Type testfunc1(Prm v1, Prm v2, Prm v3, Prm v4, Prm v5, Prm v6, Prm v7, Prm v8, Prm v9, Prm v10){
return (v1|v2|v3|v4|v5|v6|v7|v8|v9|v10);
}
100 миллион раз:
for(Type y = 0; y < 10000; y++){
for(Type x = 0; x < 10000; x++){
out |= testfunc1(x,y,x,x,y,y,x,y,x,y);
}
}
С типами int
, const int
и const int &
, я заметил, что const int
быстрее, чем const int &
. (Примечание: im использует возвращаемое значение, чтобы гарантировать, что функция не будет оптимизирована).
Почему это так? Я всегда думал, что добавление &
действительно сделает это быстрее, но тесты говорят об обратном. Я знаю, что для более крупных типов данных это, вероятно, будет другой результат, я не тестировал их, хотя, поскольку я совершенно уверен в результатах.
Мои тесты:
const int: 7.95s
const int &: 10.2s
Edit: Я думаю, что это на самом деле из-за моей архитектуры; Я тестировал с Sint64
типа и результаты были:
const Sint64: 17.5s
const Sint64 &: 16.2s
Edit2: Или это? Испытано с double
типа (который является 64-битной?), И результаты заставляют меня озадачило:
const double: 11.28s
const double &: 12.34s
Edit3: обновлен код цикла, чтобы соответствовать моим новейшие тесты с типами 64-битных.
Использование возвращаемого значения, как и вы, не гарантирует, что он не будет оптимизирован. Как и все вычисления могут быть выполнены во время компиляции, поэтому компилятор может оптимизировать все, заменив циклы просто «0x3FFF». –
Мне будет интересен ответ на этот вопрос. Может быть, что const int обрабатывается по-разному с помощью пролог-кода функции (помещается компилятором), чем const int &. Я принимаю обоснованное предположение. – octopusgrabbus
@ R.MartinhoFernandes, ну, если бы он оптимизировал его, он не выполнил бы его за 7,95 секунды;) не говоря уже о том, что мой компилятор не уверен в этом умном (ему удалось оптимизировать его, только если я дал постоянные значения для параметров) , – Rookie