Исторически в таких языках, как C ++, исключения были очень медленными по сравнению с другими формами управления потоком на том же языке .
В C ++ работают две вещи:
- Бросить исключение очень сложно. Стек должен быть размотан, и в нативном коде это сделать намного сложнее, чем в языке высокого уровня на основе виртуальных машин.
- Регулярное, прямое управление потоком чрезвычайно быстро. Это нативный код; ветвь - это пара инструкций, где при откате стека исключение вызывает сложный алгоритм (поиск данных стека в большой, возможно, сжатой таблице и т. д.).
Это несоответствие в производительности привело к общей мудрости, стоящей за исключениями: делайте это только для необычных вещей, поэтому он используется только там, где это наиболее выгодно, а не там, где это ухудшит производительность.
Это не относится к языкам высокого уровня. Это также по двум причинам:
- Откат стека намного, намного проще. Стек очень легко исследовать; вам не нужны магические таблицы, чтобы знать, как далеко откатится стек и какие объекты создаются в любой момент времени.
- Обычный поток программ по своей сути медленнее. В языке на основе виртуальной машины все просто требует больше работы для начала.
Исключения по-прежнему не бесплатны, но несоответствие больше не о чем беспокоиться. Это означает, что общая мудрость, сформированная в C ++, здесь используется неправильно. Исключения регулярно используются в обычном программном потоке.
Фактически, они встроены в язык, в конструкции, которые вы используете постоянно. Каждый раз, когда вы используете итератор - каждое for x in xrange(1000)
, исключение StopIteration
используется для завершения цикла.
Выбирайте исключения или линейное управление потоком в Python, исходя из которых имеет больше смысла. Не выбирайте, основываясь на производительности, если только вы не находитесь во внутреннем цикле, где производительность имеет значение; в этом случае, как всегда, профиль и выяснить, если это действительно имеет значение.
(я не могу говорить за PHP.)