代码之家  ›  专栏  ›  技术社区  ›  Ken

目标C优化

  •  9
  • Ken  · 技术社区  · 14 年前

    ObjuleC有标准的优化技巧,以便在C++中或“G++FAST”标签中沿着“内联”频繁的方法执行更快的操作吗?

    编辑:当themethod有两个(或更多)整数供输入时,是否有人有一个使用sel和imp的简短示例?

    2 回复  |  直到 13 年前
        1
  •  12
  •   dreamlax    14 年前

    这是一个小的优化,可能不值得花时间来实现,而且我从来没有亲自使用过,但我想仍然很好地知道。通过直接使用方法实现,您可以绕过重复的方法调度,而不是反复向同一对象发送相同的消息。例如,而不是:

    for (int i = 0; i < 100000000; i++)
        [someObject messageWithInt:i];
    

    您可以尝试:

    SEL theSelector = @selector(messageWithInt:);
    IMP theMethod = [someObject methodForSelector:theSelector];
    
    for (int i = 0; i < 100000000; i++)
        theMethod (someObject, theSelector, i);
    

    这意味着方法查找只完成一次,并且可以通过返回的 IMP 值。所有Objective-C方法实现都至少接受两个参数,第一个参数是类型为的接收对象 id ,变成 self 在方法实现中,第二个参数是[类型的 SEL ]用于确定方法实现,并成为 _cmd 在方法实现中。

    如果您不使用正确的“函数定义”(我记不起正确的术语),这种方法会很快变酸。 进口 是一个 typedef 对于返回的函数 void* 并采取 (id,SEL,...) 作为论据。如果该方法实际返回类似于 float . 为了帮助解决这个问题,您可以将返回值 -methodForSelector: ,如下所示:

    typedef float (*MyMethodIMP)(id,SEL,int);
    
    SEL theSel = @selector(messageWithInt:);
    MyMethodIMP theMethod = (MyMethodIMP)[someObject methodForSelector:theSel];
    float result = 0.0;
    
    for (int i = 0; i < 100000000; i++)
        result += theMethod (someObject, theSel, i);
    

    小心点,你可以 theMethod 并且您可能能够将它用于特定类的所有实例,而不仅仅是一个实例,而是要小心处理。

        2
  •  9
  •   Community Mike Kinghan    7 年前

    优化最好由编译器处理。macs使用gcc,因此标准优化gcc标志(-o) 水平 )应该有效。在Xcode中,可以在 project settings . 如果不使用gcc,请查看编译器文档以了解如何启用优化。

    更新:xcode 4使用 LLVM 默认为后端。GCC和Clang前端都使用“-o n “优化标志。对于GCC, n 是0到3之间的整数,或“s”或(仅限Apple)“z”。对于Clang, n 是0到4之间的整数,或“s”。