从历史上看,在C++等语言中,与同一语言中的其他形式的流控制相比,异常非常缓慢。
在C++中,有两件事在起作用:
- 引发异常非常复杂。堆栈需要解卷,在本机代码中执行此操作比在基于 VM 的高级语言中更难。
- 常规的直接流量控制速度非常快。它是原生代码;分支是几个指令,其中回滚堆栈的异常调用复杂的算法(在大型的、可能压缩的表中查找堆栈数据,依此类推)。
这种性能差异导致了例外背后的普遍智慧:只对不寻常的事情这样做,所以它只在最有益的地方使用,而不是在会损害性能的地方使用。
这不适用于高级语言。这也有两个原因:
- 回滚堆栈要简单得多。堆栈非常容易检查;您不需要魔术表来知道堆栈回滚多远以及在任何给定时间构造了哪些对象。
- 常规程序流本身就比较慢。在基于VM的语言中,一切都只需要做更多的工作就可以开始了。
例外仍然不是免费的,但这种差异不再是需要担心的事情。這意味著在C++中形成的一般智慧在這裡被誤用了。异常经常在正常程序流中使用。
事实上,它们被内置到语言中,在你一直使用的构造中。每次使用迭代器时 -- 每个 ,都会使用一个异常来结束循环。for x in xrange(1000)
StopIteration
在Python中选择异常或线性流控制,基于此更有意义。不要根据性能进行选择,除非您实际上处于性能至关重要的内循环中;在这种情况下,一如既往,分析并找出它是否真的重要。
(我不能说PHP。