在@try块中调用函数会导致性能损失吗?

时间:2014-02-25 20:29:50

标签: objective-c

与不使用try块调用blabla相比,这是否会导致性能下降?

-(void)bla{
    @try{
        [self blabla];
    }
    @catch (NSException *e) {
        // Do nothing
    }
}

3 个答案:

答案 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异常是根据此实现实现的。

但是,对展开器的需求将禁用一些优化机会,因此需要处理异常的代码可能不太优化,以便在不需要处理异常时进行优化。