__Attribute __ ((optimize (0))) применяется "рекурсивно"? - PullRequest
0 голосов
/ 25 сентября 2018

Скажем, я хочу использовать функцию для измерения времени выполнения, я хочу избежать того, чтобы компилятор оптимизировал удаление выражений только потому, что он думает, что они ничего не делают (они этого не делают, за исключением того, что я хочу измерить, сколько времени они занимают для вычисления).Вместо того, чтобы делать странные уловки, такие как добавление их в другую переменную и т. Д., Я узнал о __atribute__((optimize(0))) в GCC.Однако, скажем, у меня есть этот код:

__attribute__((optimize(0))) void test(int n) {
    while (n--) {
        foo();
    }
}

int main() {
    std::cout << Timer::measure(test).count() << "ms\n";
}

Может ли атрибут помешать компилятору оптимизировать код внутри функции foo ()?На самом деле я просто пытаюсь протестировать некоторое время выполнения и надежно и относительно легко предотвратить компилятор от полного удаления кода (я хочу, чтобы он оптимизировал код настолько хорошо, насколько это возможно, но не удалял его, потому что он ничего не делает!).

Имеет ли это какой-то смысл?Заранее спасибо!

1 Ответ

0 голосов
/ 25 сентября 2018

Я просто подумал, что могу провести эксперимент (почему я не подумал об этом раньше), вот что я сделал:

// toggle this
// __attribute__((optimize(0)))
void waste_time() { for (unsigned i = 100000; i--; ); }

// always leave this on
__attribute__((optimize(0)))
void test() {
    for (unsigned i = 1000; i--; ) {
        waste_time();
    }
}

int main() {
    std::cout << Timer::measure(test).count() << "ms\n";
}

Что я нашел с -O3:

waste_time no optimizations: 196.972ms  (obviously the loop is not optimized)
waste_time w/ optimizations: 0.001995ms (loop is optimized)

Для меня это очень ясно, что __attribute__ не "распространяется" на вызовы вложенных функций, поэтому waste_time () все равно будет оптимизировано, даже если test () имеет указанный атрибут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...