Предположим, я хочу сравнить две конкурирующие реализации некоторой функции double a(double b, double c)
. У меня уже есть большой array <double, 1000000> vals
, из которых я могу принимать входные значения, так что мой бенчмаркинг будет выглядеть примерно так:Как заставить компилятор не пропускать мои вызовы функций?
//start timer here
double r;
for (int i = 0; i < 1000000; i+=2) {
r = a(vals[i], vals[i+1]);
}
//stop timer here
Теперь, умный компилятор может понять, что я могу только когда-либо использовать результат последней итерации просто убейте остальных, оставив меня с double r = a(vals[999998], vals[999999])
. Это, конечно, побеждает цель бенчмаркинга.
Есть ли хороший способ (бонусные баллы, если он работает на нескольких компиляторах), чтобы предотвратить такую оптимизацию при сохранении всех других оптимизаций?
(я видел другие темы, о вставке пустых asm
блоков, но я боюсь, что может предотвратить встраивание или переназначение. Я тоже не особо любит идею сложения результатов sum += r;
во время каждой итерации, потому что это дополнительная работа, не следует включать в результирующие тайминги. Для целей этого вопроса было бы замечательно, если бы мы могли сосредоточиться на других альтернативных решениях, хотя для всех, кто интересуется этим, есть оживленная дискуссия в комментариях, где консенсусом является то, что +=
является наиболее подходящим методом во многих случаях.)
Зачем вам это нужно? –
Потому что у меня есть две разные реализации 'a', и я хочу их сравнить. – us2012
Переупорядочение обычно выполняется как оптимизация, afaik. –