原因是什么,Swift 应该比 Objective-C 快得多? [关闭]

2024-01-02

正如 Craig 在 Swift 公告中透露的那样,据说它迄今为止比 Objective-C 更快。

但我不太相信这种比较,因为正确实现的算法在 C 中应该是最快的,因为它可以由编译器高度优化,并且本质上是硬件友好的。 所以我猜测 Swift 可以获得的最佳性能是 C 语言中相同算法的性能。

既然 C 是 Objective-C 的一部分,为什么 Objective-C 和 Swift 的性能差距那么大呢?

我能想象的唯一原因是苹果使用 NSNumbers 等而不是 C 类型,但不应该作为 Obj-C - Swift 比较的基础,对吧?


这很大程度上是猜测(尽管是有根据的猜测),但我的两大理论是:

1) No 减少动态方法调度。 Objective-C 中的每个方法调用都会经过objc_msgSend。在最快的情况下,这可以快至 16 条指令,但也可能慢很多。与 Objective-C 相比,Swift 会在更少的情况下遭受这种惩罚,例如:对仅 swift 协议方法的方法调用不会命中objc_msgSend,但是如果协议是在 Obj-C 中声明的,或者 swift 协议用@objc(这样它也可以被 Objective-C 对象采用),然后对 swift 对象采用的该协议中的方法的方法调用似乎是通过objc_msgSend.

2) 避免堆分配。在 Objective-C 中,(实际上)每个对象都是在堆上分配的。使用静态类型系统,编译器可以推断有关对象生命周期的更多信息,并将其分配到堆栈上,除非它必须跨越 Objective-C 边界(或者太大而无法在堆栈上分配)。

我怀疑#2 是这两者中更大的一个,但两者都可能是重要的贡献者。我确信不仅仅是这个,但他们是两个很可能的贡献者。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

原因是什么,Swift 应该比 Objective-C 快得多? [关闭] 的相关文章

随机推荐

  • java.io.IOException:准备失败。:状态= 0x1

    我在使用phonegap的媒体时得到这个 这首歌无法播放 而是收到错误代码 5 有任何想法吗 05 26 02 35 41 796 1153 8918 V PlayerDriver HandleInformationalEvent PVMF
  • 在 Windows 7 盒子(64 位)上从 vb.net 创建快捷方式

    我正在尝试在 Windows 7 机器 64 位 上从 vb net 代码创建桌面快捷方式 以下代码在 XP 上运行 但在 Win7 上运行时 我只收到一条消息 说明该应用程序已停止工作 Imports IWshRuntimeLibrary
  • 如何使用 Delphi Win32 编写 SOAP 1.2 客户端的最佳方式

    目前还没有Delphi版本支持SOAP http en wikipedia org wiki SOAP 28protocol 291 2 客户端或服务器 我已经尝试了几个星期让它工作 但每次出现新问题时 使用 VS C 我都可以做同样的事情
  • 用 JSX 中的标签替换部分字符串

    我正在尝试用 JSX 标签替换字符串的一部分 如下所示 render function result this props text replace div div return div result div 但考虑到this props
  • NestJs 中所有装饰器的 Eslint 错误“已定义但从未使用”警告

    我正在为一个项目使用 NestJs 框架 今天发现EsLint发现了587个错误的问题 所有装饰器都会生成此错误 warning IsBoolean is defined but never used typescript eslint n
  • 带通滤波器组

    我已经实现了一组定向带通滤波器本文中描述的 https www researchgate net publication 220539167 Multidirectional Scratch Detection and Restoratio
  • 是否可以自动获取 Intellij 的正则表达式帮助来获取自己的正则表达式参数

    Intellij 为需要正则表达式的参数提供正则表达式 帮助 语法检查 例如编码 String array string split 将在正则表达式下标记错误并提供工具提示错误 不封闭组 这也适用于变量 例如 String myVar sh
  • 使用 Pusher API 通知特定用户

    我有一个使用jquery mobile和phonegap的移动网络应用程序 另一个是php网站 我希望只向在线和移动应用程序上的特定用户发送通知 接收在php网站端和移动网络应用程序上在线的用户的通知所以我的问题是如何为特定用户设置频道 因
  • WPF BitmapFrame 和多线程

    我有一个 PNG 文件存储在我的云中的 blob 存储中 我想下载它并在 WPF 中将其渲染在屏幕上 我知道调度程序和冻结 但没有任何作用 我不断收到有关 另一个线程拥有它 的错误 这是我所拥有的 var decoder GetDecode
  • 如何为Python安装scipy?

    我有Python 2 7 而且我有迪斯图尔斯 http docs python org library distutils html安装 我下载了最新版本的Scipy 赢得 32 http sourceforge net projects
  • Ansible fileglob:无法在预期路径中找到...

    我正在尝试使用 ansible 删除目录中的所有文件 同时保留目录 为此 我正在使用with fileglob按任务键将所有文件从该目录中取出item变量 我创建了一个最小的示例来显示我的问题 流浪文件 Vagrant configure
  • 开发客户端-服务器 iPhone 应用程序

    如果我想开发一个采用客户端 服务器设计的 iPhone 应用程序 iPhone 设备作为客户端和 C 服务器 有两个问题 是否可以使用我自己的笔记本电脑来运行服务器 如果不是 我有什么选择 我是否必须开发自己的消息传输协议 因此 如果我理解
  • 使用动态/具体类型初始化类型变量

    我正在学习 Scala 我试图创建一个类型类来解决 每种动物都吃食物 但食物的类型取决于动物 的问题 我有一个Eats具有上下文边界的类型类 trait Eats A lt Animal B lt Edible object Eats de
  • UWP:如何调用WinAPI方法

    我的问题很简单 我如何调用 WinAPI 方法 例如空剪贴板 https msdn microsoft com de de library windows desktop ms649037 v vs 85 aspx在 UWP 应用中 我包含
  • 如何限制图例大小并使其可与饼图一起滚动?和 javafx 布局

    我在我的 Swing 面板上集成了 javafx 饼图 它工作正常 但我的数据列表太大 无法放入图例中 并且图例正在扩展 导致饼图变小 我想让它可滚动但找不到任何解决方案 我是 javafx 新手 另外 您建议饼图面板和场景采用什么布局来适
  • 向 SQLAlchemy 查询添加上下文注释

    我正在尝试找出一种方法来向 SQLAlchemy 生成的查询添加注释 以指示其起源点 我知道 prefix with 方法 但对它不满意 因为它只会将前缀放在 SELECT 之后 并且我希望我的注释与实际查询逻辑完全分开 我偶然发现了一个解
  • PHP:使用“new”初始化数组与不使用“new”初始化数组有什么区别?

    我总是通过填充数组来创建数组 foo car 但我见过很多 foo array foo car and foo new array 不初始化 使用 array 和使用 new array 之间有什么区别 thanks 您不可以使用以下方法在
  • EF 上具有默认过滤器的实体

    我的 edmx 文件中有一个名为 Client 的实体 我必须对其运行多个 linq 查询 但在所有查询上 我需要一个过滤器 假设 active 1 我不想有一个where c active 1对于我的所有查询 我的实体应用了默认过滤器更有
  • WPF - 从组标题样式中绑定到当前项目

    我是 WPF 菜鸟 所以请对我放轻松 我正在尝试创建一个分组的 DataGrid WPF 工具包版本 我已成功创建数据源 DataGrid 本身 所需的 CollectionViewSource 和组标题的样式 使用扩展器 我想按名为 As
  • 原因是什么,Swift 应该比 Objective-C 快得多? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 正如 Craig 在 Swift 公告中透露的那样 据说它迄今为止比 Objective C 更快 但我不太相信这种比较 因为正确实现的算法在