[как правильно] Алгоритм

darin06

Привет всем! Вопрос следующий:
Есть большой-большой цикл ('for' loop, >1e9 iterations, Monte-Carlo simulations на каждой итерации делается нечто, и хочется, скажем раз в 1e4 иттераций, делать вывод промежуточных результатов (их немного и я могу выкидывать в буффер). Насколько плохо делать внутри этого цикла проверку условия 'if'-ом и какова альтернатива, если это плохо?

Anturag

Делать либо как ты сказал, либо делать вложенный цикл, количество инструкций на итерацию очевидно будет меньше во втором случае.

Dasar

какова альтернатива, если это плохо
делать вывод другим тредом без синхронизации. При этом продумать как именно будут проявляться побочные эффекты от отсутствия синхронизации и их минимизировать.

darin06

В качестве альтернативы додумался до вложенного цикла, каждый вложеный зависит только от результатов предыдущего. Вопрос теперь сокращается до первой части начального. Насколько плохо иметь в большом цикле проверку условия?

Maurog

Насколько плохо делать внутри этого цикла проверку условия 'if'-ом и какова альтернатива, если это плохо?
только ты можешь понять плохо это или нормально
выведи да посмотри, как это повлияет на работу
если сбор\вывод статистики у тебя является быстрой операцией (особенно по сравнению со всей симуляцией то смело выводи
если это долгая операция, то имеет смысл уже ускорять приложение (выводить процедуру в другой поток, делать не на каждые 1e4, а на каждые 1e5 и тд)
если вопрос не о скорости, а о дизайне приложения, то никаких противопоказаний нет (во всяком случае данных очень мало) :grin:

Anturag

Величина плохости обратно пропорциональна величине необходимости.

Dasar

Насколько плохо иметь в большом цикле проверку условия?
хуже, чем если бы этой проверки не было.
а конкретный ответ станет ли хуже существенно или будет вообще незаметно может дать только замер производительности: до вставки и после.

darin06

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

apl13

Как я понимаю вложеные циклы выгоднее, поскольку в противном случае на каждой иттерации будет делаться проверка, разве нет?
Она, правда, на пару-тройку порядков меньше времени занимает, чем одна итерация Monte-Carlo simulation, мне кажется.

Maurog

хуже, чем если бы этой проверки не было
да скорее всего неважно есть там эта проверка или нету
надо профилировать

Anturag

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

Dasar

да скорее всего неважно есть там эта проверка или нету
если тело цикла маленькое и компилятор умеет его разворачивать, то if будет ухудшать такой разворот. И тогда лучше, конечно, делать через вложенный цикл без if-а.

luna89

Вроде branch prediction должен все разрулить?

Dasar

Вроде branch prediction должен все разрулить?
branch predction только избавит от потерь на выгрузку/загрузку команд в процессор, но полутакты выполнения if-а все равно никуда не денутся.

agaaaa

Пиши сначала с if. Оптимизацией потом займёшься, с профайлером в руках.
Оставить комментарий
Имя или ник:
Комментарий: