Здравствуйте, Павел Кузнецов, Вы писали:
ПК>При хорошем оптимизаторе так тоже что-нибудь существенное намерять не выйдет:
...
ПК>Т.е. и цикл, и вызовы Get() пошли на север
Сопротивление компайлера понятно, но преодолимо
. Выйти должно, так или иначе. Так как чудес не бывает, а оптимизации обязаны сохранять семантику, то цикл пошел на север только потому, что результат вычислений не используется, а const гарантирует отсутствие побочных эффектов. Dataflow analyzis какой-нибудь. Что, если все-таки попользовать pА
после цикла, например, вывести значение указателя на печать? Тогда оптимизатор не сможет выкинуть цикл, и все получится
.
Для пущей защиты от навязчивых оптимизаций (нам надо именно виртуальный вызов мерять, так?) можно также вынести цикл в отдельную функцию, сделать количество итераций параметром, и возвращать pA как результат. Опцией компилятора запретить автоинлайн функций, если он это умеет. Так прокатит?
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Т.е. и цикл, и вызовы Get() пошли на север
Именно об этом я и говорил когда сказал, что синтетика превращается в профанацию. VC и GCC очень часто делают подобные оптимизации. Но стоит сделать не тупую синтетику, а хотя бы мало мальский алгоритм, как точас же все компиляторы отбрасывают приколы и ведут себя как ожидается.
Возможно когда нибудь компиляторы научатся оптимизировать алгоритмы, но будет это явно не скоро.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Здравствуйте, Gaperton, Вы писали:
ПК>>Т.е. и цикл, и вызовы Get() пошли на север
G>Сопротивление компайлера понятно, но преодолимо . Выйти должно, так или иначе. Так как чудес не бывает, а оптимизации обязаны сохранять семантику, то цикл пошел на север только потому, что результат вычислений не используется, а const гарантирует отсутствие побочных эффектов. Dataflow analyzis какой-нибудь. Что, если все-таки попользовать pА после цикла, например, вывести значение указателя на печать? Тогда оптимизатор не сможет выкинуть цикл, и все получится .
G>Для пущей защиты от навязчивых оптимизаций (нам надо именно виртуальный вызов мерять, так?) можно также вынести цикл в отдельную функцию, сделать количество итераций параметром, и возвращать pA как результат. Опцией компилятора запретить автоинлайн функций, если он это умеет. Так прокатит?
Все это пожет оказаться пустм делом. Тупые тесты компиляторы обхдят. Они и виртуальные вызовы могут заинлайнить.
Я уже для себя давно нашел выход. Нужно просто использовать реальные алгоритмы. Я еще ни разу не видел, чтобы компилятор смог выкинуть что-то если оно действительно было нужно для алгоритма.
Например, можно использовать Visitor или Comparer-ы.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>