- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
ВЫНЕСЕНИЕ ИНВАРИАНТНОГО КОДА ЗА ПРЕДЕЛЫ ЦИКЛА
Инвариантным называется код, не изменяющийся в ходе выполнения цикла. А раз так, –
то какой смысл выполнять его в каждой итерации – не лучше ли вынести такой код за пределы цикла?
Рассмотрим следующий пример:
for(a = 0;a <(b*2); a++)
printf("%x\n",a*(b/2));
Выражения (b*2) и (b/2) очевидно представляют собой инвариант, и оптимизированный код будет выглядеть так:
tmp_1=b*2;
tmp_2=b/2;
for(a=0;a<tmp_1;a++)
printf("%x\n",tmp_2+=tmp_2);
Это экономит одну операцию деления и две операции умножения на каждую итерацию, что очень и очень неплохо!
Компиляторы Microsoft Visual C++ и WATCOM успешно распознают инвариантный код и выносят его за пределы цикла,
а вот Borland C++ увы, нет.
Всегда было интересно узнать кто-нибудь чему-нибудь научился на книжках KPNC ?
Steve_Brown 29.12.2016 13:18 # +1
Единственным недостатком является неэквивалентность оптимизированного кода исходному, но, с учетом возросшего быстродействия, с этим можно смириться.
bayan 29.12.2016 14:09 # −1
roman-kashitsyn 29.12.2016 14:12 # +2
KPNC is a radio station broadcasting a Country music format. Licensed to Ponca City, Oklahoma, USA. The station is currently owned by Team Radio, L.L.C..
> tmp_2+=tmp_2
Смачный эпик фейл гореоптимизатора.
bayan 29.12.2016 15:13 # −2
Кузбасский научный центр
>>Смачный эпик фейл
Это компайлер-специфик оптимизация.
Конкретно в его компиляторе этот UB дает прирост 42%
roman-kashitsyn 29.12.2016 15:28 # +1
Где здесь UB, bayan?
Дело в том, что в оригинальном коде выводилась арифметическая прогрессия
0, (b/2), 2*(b/2), 3*(b/2), ...
После "оптимизации" прогрессия стала геометрической
2*(b/2), 4*(b/2), 8*(b/2), 16*(b/2), ...
bayan 29.12.2016 15:31 # −2
guestinho 29.12.2016 15:34 # −1
bayan 29.12.2016 15:36 # +1
вполне может быть что я обосрался
huesto 29.12.2016 16:08 # +1
dxd 29.12.2016 16:44 # −2
bayan 29.12.2016 17:30 # −68
bayan 29.12.2016 17:36 # −67
вычисление левой и правой части может случиться в любом прядке
грубо говоря
FOO() + BAR() может сначала вычислить FOO или сначала вычислить BAR
А тут такой проблеиы нет
ProctologistForYou 29.12.2016 22:51 # −67
Dr_Stertor 30.12.2016 15:56 # −66
bayan 30.12.2016 17:02 # −66
rotretS 30.12.2016 21:43 # −67
Впредь прошу обходить меня стороной; не люблю пускаться в долгие дискуссии с людьми, чья компетентность вызывает у меня сомнения:
http://www.govnokod.ru/21911#comment363772
barop 30.12.2016 22:37 # −67
Ты ничего не умеешь кроме билдера, и потому априори считаешь все остальные технологи говном.
Ну да, это конечно же проще чем признать что ты ничего не умеешь
Dr_Stertor 31.12.2016 15:29 # −68
@и потому априори считаешь все остальные технологи говном.
Я так не считаю. Но, беря во внимание тот факт, что продукты Борланд актуальны в 2016 году - это говорит само за себя.
guest 31.12.2016 16:08 # −66
ахах
inkanus-gray 31.12.2016 16:29 # −68
barop 31.12.2016 20:28 # −65
Dr_Stertor 31.12.2016 19:00 # −66
У нас 31.12.16, 20.00
defecate-plusplus 31.12.2016 19:03 # −66
Dr_Stertor 31.12.2016 21:07 # −66
barop 31.12.2016 20:28 # −67
Именно потому все новые стартапы пишутся обычно на Delphi
guest 31.12.2016 20:37 # −66