函数名会影响性能吗?

Do function names affect performance?

Swift为预编译语言,所有对象都转换为内存地址;但是,Swift 中有一个特殊的“选择器”,允许在运行时通过函数名找到函数。这是如何工作的?这是否意味着命名功能会影响运行效率?

,函数名称不会有意义地影响Swift中的性能。

一旦编译到您的程序中,函数和方法名称将以两种主要方式使用:

  1. 直接(静态)按名称调用函数时,编译后的代码参考符号(函数名,转换成格式suitable进行包含在生成的二进制代码中)——然后在 linking, either statically or dynamically 期间转换为 constant 跳转操作
    • 简化:函数名对调用函数没有影响;拨打电话时不会以任何方式考虑
  2. 当使用 Objective-C 运行时动态调用函数时(例如,作为 selector),函数名称用于在 class 中查找适当的方法'方法缓存。选择器在程序中是 unique,因此 function/method 名称被映射到全局唯一的选择器,然后用于查找(通过指针,而不是名称)
    • 当您静态(例如#selector(...))引用选择器时,唯一选择器会预编译到您的程序中,因此名称永远不需要在运行时查找,选择器指针本身可以在调用方法时直接使用
    • 如果您动态地引用一个选择器(例如NSSelectorFromString(...)),选择器会根据给定的名称动态地查找(在全局table唯一选择器),如果找不到,则在运行时动态创建一个新的选择器

在 (1) 和 (2a) 这两种情况下,函数的名称在进行调用的过程中从未真正使用过,并且无关紧要。在情况 (2b) 中,技术上 是(用于选择器查找),但过程如此之快 以至于它真的无关紧要。方法名称很少很长,因为它们通常是手动输入的,并且与程序可以执行的大多数操作相比,即使是最动态的用例(在运行时手动查找方法)也是微不足道的,你真的不应该担心关于它。


另一个考虑因素:当你编译一个嵌入了符号的程序时,这些符号在你的二进制文件中占据 space。你也不应该为此担心,因为:

  1. 程序的 release 版本将去除大部分符号,并且
  2. 与代码造成的二进制大小相比,space个符号占用的数量通常也微不足道