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

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

Благодарю.

3 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам