Есть ли проблемы с производительностью при нелокальных переходах?

Я использую нелокальные переходы (setjmp, longjmp). Я хотел бы знать, может ли это быть проблемой для выступлений. Сохраняет ли setjmp весь стек или только некоторые указатели?

Спасибо.


person md5    schedule 28.04.2012    source источник
comment
Проблема производительности по сравнению с чем?   -  person Oliver Charlesworth    schedule 28.04.2012
comment
Например, по сравнению с goto. Я знаю, что это две разные вещи, но...   -  person md5    schedule 28.04.2012


Ответы (3)


Как сказал Йенс, если это когда-либо станет заметным узким местом, переделайте его, поскольку предполагается, что setjmp используется не так.

Что касается вашего вопроса:
Это, вероятно, зависит от того, на какой архитектуре вы запускаете свою программу и что компилятор делает с вашим кодом. В ARM goto, вероятно, переводится в одну инструкцию перехода, что довольно быстро. setjmp и longjmp, с другой стороны, необходимо сохранить и восстановить все регистры, чтобы возобновить выполнение после перехода. На ARMv7-a с поддержкой NEON для этого потребуется сохранить примерно 16 32-битных регистров и до 16 128-битных регистров, что представляет собой довольно много дополнительной работы по сравнению с простой ветвью.

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

person Leo    schedule 28.04.2012

setjmp должен сохранить достаточно информации, чтобы программа могла продолжить выполнение при вызове longjmp. Обычно это будет текущий указатель стека вместе с текущими значениями любых других регистров ЦП, которые могут повлиять на вычисление.

Я не могу комментировать, вызывает ли это «проблему с производительностью», потому что я не знаю, с чем вы хотите это сравнить.

person Oliver Charlesworth    schedule 28.04.2012

Быстрый ответ: вряд ли. Если setjmp когда-нибудь станет заметным узким местом в вашей программе, я бы сказал, что дизайн вашей программы нуждается в капитальном ремонте.

person Jens    schedule 28.04.2012