LINUX.ORG.RU

[странное][plain C] if работает быстрее, чем #if ?

 


0

0

В общем, я в некотором замешательстве :) Есть чужой код с функцией, которая вызывается много раз и возвращает некоторое значение, причем выдача зависит от некоторого значения, не меняющегося во время работы, т.е. что-то типа :

if (task==1) {
...              
}//1
if (task==2) {
...              
}//2
if (task==3) {
...              
}//3
...

Переделываю это в такой вид (криво, но тем не менее) :

#if task==1
...              
#if task==2
...              
#if task==3
...              
...

По логике препроцессор вырезает всё лишнее и отдает нужное компилятору, т.е. регрессий быть не может, скорее наоборот (про предсказатель условных переходов в ЦПУ прекрасно знаю). НО - наблюдаю следующее странное поведение: старая версия немного, но БЫСТРЕЕ. Под немного имеется в виду следующее :

old time ~ 0m2.104s
new time ~ 0m2.130s

разница незначительна и не принципиальна, но это поведение стабильно, т.е. при увеличении числа итераций всё остается в том же духе. Кто знает, в чем причина такого странного, на мой взгляд, поведения ?

★★

У тебя используется неоптимальный алгоритм в куске кода, начинающемся на 485-ой строке. Потому и тормозит.

Deleted
()
Ответ на: комментарий от Anoxemian

Нет, компилятор один. Я пока немного грешу на метод измерения времени работы, попробую другим и позже отпишусь. Но по теории подобного расхождения быть всё равно не должно.

htower_ ★★
() автор топика

> По логике препроцессор вырезает всё лишнее и отдает нужное компилятору

а что мешает проверить, а не гадать на кофейной гуще?

cpp prog_1.c prog_1.i
cpp prog_2.c prog_2.i
diff prog_1.i prog_2.i

arsi ★★★★★
()
Ответ на: комментарий от arsi

никто не гадал, выхлопы у cpp разные, это я уже смотрел. Да они и должны быть разными

htower_ ★★
() автор топика
Ответ на: комментарий от htower_

По данному вопросу только второе. Воздержанию не обучен.

mannaz
()

> наблюдаю следующее странное поведение: старая версия немного, но БЫСТРЕЕ.

может там шутки с выравниванием кода — типа раньше какая-то критическая позиция была выровнена, теперь нет?

dilmah ★★★★★
()

а switch-case не катит в таком случае? (я не программист, не пинайте :) )

madgnu ★★★★★
()

Странно. Вообще результат должен быть аналогичен из-за оптимизации. Может быть там как-раз в куске с if'ми они не вырезаются и код лучше в кеше распологается?

anonymous
()

Если значение task в условиях можно определить на этапе компиляции (а это скорее всего именно так, раз можно все заменить директивами предпроцессора), то оптимизатор выкинет лишнее. И по сути варианты отличаться не должны. Т.е. old_time==new_time. Уверен что проблема в некорректно проведенном эксперименте. Следует обратить внимание на:

Как замерял время?

Какое влияние на результат оказали внешние факторы (работа других приложений, ну или что-то в таком духе)?

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Я так понял, что разница составила 30 мс. Это очень мало для того чтобы делать выводы. Time slice планировщика задач может быть порядка 10мс.

pathfinder ★★★★
()

В глаза бросается отсутствие «#elif»/«#else», хотя возможно в коде слишком много многоточий.

gogi
()
Ответ на: комментарий от htower_

>А по делу есть что сказать или только петросянить умеем ?
Так ты первый начал, чувак))

xydo ★★
()
Ответ на: комментарий от smalcom

Ещё крайне важно определить, что же быстрее ++i или i++.

Begemoth ★★★★★
()
Ответ на: комментарий от smalcom

И что ты скажешь, остряк, если первый вариант окажется на пяток процентов медленнее, как это произошло у топикстартера?

legolegs ★★★★★
()

Так карта легла и звёзды расположились.

Booster ★★
()
Ответ на: комментарий от htower_

А по делу есть что сказать или только петросянить умеем ?

Без кода - сказать нечего. Слишком много возможных вариантов.

Deleted
()

даа, тред на 22 комментария не считая первых двух - итого лор торт на 2/24 = 1/12

присоединяюсь, покажите уже наконец код

gavv
()

А теперь сравни эти два кода с опцией -O2.

Zodd ★★★★★
()

и чтоже в итоге? или код ТСа настолько секретен что теперь его дрючат даже за выложеные if'ы?

smalcom
()
Ответ на: комментарий от smalcom

Вероятно, ОП обнаружил нечто такое, из-за чего ему теперь стыдно за этот тред.

mannaz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.