Страницы

Поиск по вопросам

суббота, 23 марта 2019 г.

Оптимизирует ли это код?

Имеется 2 цикла: for (i = 0; i < a + 1; i++) { } и b = a + 1; for (i = 0; i < b; i++) { } Вычисляет ли процессор по новой при каждом прохождении цикла значение a + 1? То есть, по другому говоря, с точки зрения экономии ресурсов код №2 лучше №1?


Ответ

Вот результат gcc-4.6.1 на x86-64: #include
int main() { int a = 10;
for (int i = 0; i < a + 1; i++) { printf("iteration: %d
", i); } } Собираем gcc -O2 -g -Wall -std=c99 -o test test.c В gdb видим вот такое: 0x400440

push %rbx 0x400441 xor %ebx,%ebx 0x400443 nopl 0x0(%rax,%rax,1) 0x400448 mov %ebx,%edx 0x40044a xor %eax,%eax 0x40044c mov $0x40063c,%esi 0x400451 mov $0x1,%edi 0x400456 add $0x1,%ebx 0x400459 callq 0x400430 <__printf_chk@plt> 0x40045e cmp $0xb,%ebx 0x400461 jne 0x400448 0x400463 xor %eax,%eax 0x400465 pop %rbx 0x400466 retq Т.е. видим, что компилятор сам все прекрасно довел до константы 11 (см. main+30). С другой стороны, вызовы функций стоит делать руками. Вот такое gcc уже не потянул, printf в функции сбил его с толку: #include
int foo() { printf("called foo
"); return 10; }
int main() { for (int i = 0; i < foo() + 1; i++) { printf("iteration: %d
", i); } } Там уже call на каждую итерацию. Premature optimization is the root of all evil —Donald Knuth

Комментариев нет:

Отправить комментарий