与不使用try块调用blabla
相比,这是否会导致性能下降?
-(void)bla{
@try{
[self blabla];
}
@catch (NSException *e) {
// Do nothing
}
}
答案 0 :(得分:4)
来自doc
零成本@try阻止
进入零成本@try块的64位进程不会产生 性能惩罚。这与32位机制不同 进程,调用setjmp()并执行额外的“簿记”。 但是,在64位中抛出异常要贵得多 可执行文件。为了获得64位的最佳性能,你应该抛出 仅在绝对必要时才有例外。
因此 64位进程没有开销
答案 1 :(得分:4)
在某些平台上,@ try / @ catch是“零成本”。只要没有抛出异常,就不会为try块执行额外的代码。以异常展开数据的形式存在额外开销,但在抛出异常之前也不会占用任何实际内存。这些平台包括64位OS X和64位iOS。
在某些平台上,仅输入@try会产生一些CPU开销来保存寄存器。这些平台包括32位OS X和32位iOS。
答案 2 :(得分:3)
您可能会对此博客感兴趣:LLVM PROJECT BLOG
那就是英特尔和Okt. 2013年,在ARM上,C ++异常现在是“零成本”。
Objective-C异常是根据此实现实现的。
但是,对展开器的需求将禁用一些优化机会,因此需要处理异常的代码可能不太优化,以便在不需要处理异常时进行优化。