iPhone5s的 A7处理器 变化

6 篇文章 0 订阅

ARM64

iPhone 5S的64位CPU是配有更宽寄存器的ARM处理器,与32位ARM架构相比,64位ARM架构包括以下重大变动:首先是名称的变化——它的官方名称为 “AArch64”,但这个名字读起来很绕口,敲起来也别扭。苹果称它为ARM64,我也更倾向于用这个名字。

较32位ARM架构而 言,ARM64的整数寄存器数量增加了一倍,32位ARM架构有16个整数寄存器,其中1个是专用的程序计数器,还有2个用于堆栈指针和链接,其他13个 则作一般用途。而ARM64位架构有32个整数寄存器,包括1个专用的零寄存器,1个链接寄存器和1个帧指针寄存器,还有1个寄存器预留给平台,另外28 个则为通用整数寄存器。ARM64上可用浮点寄存器的数量有所增加。32位ARM处理器有32个32位浮点寄存器,还有16个额外的64位寄存器。这些寄 存器的结构有些特殊,可被视为等价于16个重叠的128位寄存器。ARM64则将其简化为32个128位寄存器,且没有重叠。

寄存器的数量 会对性能会产生巨大影响。与CPU相比,内存要慢得多。与CPU处理一条指令的时间相比,读取和写入内存都需要更长时间。CPU试图通过引入缓存来缓解这 一差距。但与CPU内部的寄存器相比,即使速度最快的缓存也慢得多。更多的寄存器意味着更多数据能存储在CPU内部,这降低了内存访问频率,同时提高了性 能。

除了增加寄存器数量,ARM64也为指令集带来了重大变化。大多数32位ARM处理器可基于运行时条件寄存器的状态执行条件指令,这使 得在编译if等语句时无需分支。不过这种方式引入的麻烦多于便利,因此ARM64取消了条件执行。ARM64的NEON SIMD单元完全符合IEEE754双精度标准,而32位版本的NEON SIMD单元只支持单精度。ARM64还增加了专门的AES、SHA-1、SHA-256加密指令。这些指令也许对普通应用帮助不大,但对特定领域的应用 来说价值无穷。



Objective-C Runtime变化

在Mac OS X 10.7操作系统中,苹果引入了标签指针,这种指针允许某些类和其少量实例数据完全存储在指针中。这样在使用某些类时(如NSNumber)就无需分配内 存,并提升性能。标签指针仅支持64位架构,一部分原因是受二进制兼容制约,另一部分原因是32位指针预留的数据空间不足。之前的iOS系统都不支持标签 指针,而在ARM64位架构中,Objective-C Runtime已包含了标签指针,因此也可以享受Mac系统所具备的便利了。

尽管指针为64位,但在实际使用中,这些位数并不是都用上了。例如X86-64的Mac OS X系统仅使用了其中的47位。而ARM64上占用得更少,目前只有33位。只要未被系统全部占用,这些指针就能用于存储数据。这是Objective-C Runtime演进史上最重要的变化之一。

另作他用的ISA指针

Objective-C对象是连续的内存块,这个内存块中第一个指针大小的部分称为ISA。一般来说,ISA是一个指向该对象所属类的指针。

不过这么大的空间仅作为指针有点儿浪费,尤其是在64位CPU上。运行iOS的ARM64目前仅使用了一个指针的33位,而其余31位则另作他用。另外,类 指针还需要对齐,这就释放了另外3位,于是ISA指针中共有34位可另作他用。苹果的ARM64 Runtime正是利用了这一点使性能有了大幅提升。

不过,最重要的性能提升也许得益于内联引用计数。几乎所有的Objective-C对象都采用引用计数(NSString文字等常量对象是例外),这使得修 改引用计数的操作极为频繁。尤其对于采用自动引用计数的系统来说,资源消耗非常高。因此,提高引用计数的性能变得至关重要。

以往,引用计数 并不存储在对象中,因为ISA空间不足。当然,我们可以为每个对象专门分配一块空间用于保存引用计数,但这会占用更多的内存空间。对今天的系统来说,额外 的空间也许不算什么,但对早期的Objective-C系统影响严重。由于这样的原因,引用计数被系统存储在了一个单独的表中。

于是,当为对象增加新引用时,Runtime会执行以下操作:

  • 获取全局计数哈希表;
  • 锁定表以确保线程操作的安全;
  • 查询表中对象的计数;
  • 增加计数,并将新值重新存储到表中;
  • 解除锁定。

这些操作非常缓慢!即使用最快的哈希表,也没有直接从内存访问来得快。

对于ARM64,ISA字段中的19位用于内联存储引用计数。这意味着,增加对象引用的步骤可以简化为:在ISA字段正确部分执行原子操作加一。

仅此而已!速度将会快得多!当然,还有一些极端情况需要处理,真正的操作会略微复杂一些。

以往在回收Objective-C对象时,需要执行大量清除工作,跳过其中不必要的步骤,就可以提高性能。利用剩余的可用位,还有其他一些方法可使回收对象的速度更快。

将上面提到的所有优化集合在一起,ARM64的性能优势就变得非常明显了。根据我自己不太严格的性能测试显示,在iPhone 5S 32位模式下,基本对象的创建和销毁大约需要380ns,而在64位模式,仅需200ns。如果某类实例曾有过弱引用并与对象集合关联,32位模式下的耗 时上升至约480ns,而64位模式下保持不变,仍为200ns。


转载地址:http://www.csdn.net/article/2013-11-06/2817410

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值