2013-08-16 2 views
1

я практиковал на каком-то сайте конкурентного программирования, как UVa или LOj и заметил несколько раз (10 раз или больше!), Что положить ненужную петлю в моей программе, например, помещая это в начале программы-Почему C++ ненужный цикл делает программу быстрее?

for (int _delay = 0; _delay < 500000000; _delay++); 

заставляет его работать быстрее (!), Что обычно и дает мне лучшие ряды. Я снова и снова повторяю, но это продолжается. Мой вопрос в том, как это возможно? Просто совпадение (что случалось много раз) или скомпилированная программа, получившая оптимизацию по какой-то причине?

+0

В случае, если вам интересно, я написал функцию задержки один раз, и я вызвал ее в начале моей программы по ошибке в первый раз, когда это произошло. – crysoberil

+2

Вы можете решить большинство вопросов об оптимизации, сравнив машинный код с этим циклом и без него. – Kaz

+0

Хорошо, это немного странно, но я мог видеть, что изменение значения некоторых эвристик, и это может в конечном итоге заставить компилятор скомпилировать его по-другому. Посмотрите на код сборки, чтобы узнать. – harold

ответ

0

Предполагая, что такой бесполезный цикл имеет никакого влияния на скомпилированный код, один источник разницы в производительности может быть инструкциями ветвления, падающими в разные ведра, делая более точным предсказание ветвления в ЦП (см. Why would introducing useless MOV instructions speed up a tight loop in x86_64 assembly?). Однако вам нужно будет запустить программу в контролируемой среде для правильного тестирования; Я бы не стал доверять измерениям, сделанным онлайн-судьей.

3

Я думаю, что большинство из составителей будет игнорировать следующее заявление вы упомянули:

for (int _delay = 0; _delay < 500000000; _delay++); 

, поскольку для цикла ничего не делает, а лишь модифицируя локальную переменную, которая лежит сфера только в течение петли.

Что касается вышеприведенного утверждения делает всю программу быстрее ... Я не думаю, что мог ...

+0

Есть ли вероятность, что компилятор игнорирует этот сегмент кода и запускает оптимизацию при компиляции? – crysoberil

+0

Может быть такая возможность, но я не думаю, что это может относиться к общему делу, хотя .... – keelar

+0

Да, это совершенно странно. Я проверил дело на несколько других моих решений, так как писал этот вопрос. Это временное различие просто сохраняется! – crysoberil

Смежные вопросы