Swift、Objective C语言性能测试
Swift发布是苹果近来最大的一个事件,谁赢得应用开发者,谁将赢得世界。
Swift包含了很多现代语言特性尤其是从脚本语言中吸取了很多营养,此外苹果发布Swift时,使用特别选用的一些例子来宣称Swift性能对于Ojbective C的大幅提升,如复杂对象排序。
不过仔细聆听苹果的发布视频,当Craig宣称性能有提升时,掌声一片,但别着急,保持聆听,当展示第1个实例时掌声寥寥,而对于第2个性能测试实例,则未能获得掌声。
为什么呢?是例子过于特殊缺乏说服力,发布现场的人员不买账吗。
开发者Keith第一时间给出了自己的测试结果,实际数据显示,Swift在简单循环、递增、赋值、数组扩展、字符串拼接上性能远不如Objective C。可能的一个解释是Swift使用类classes,总在执行ARC(Auto Referrence Count),而Objective C则更多使用C风格的数据类型。
具体测试方法、代码和数据引用如下:
循环(Loop a million times)
Swift: 0.0036s
Objective-C: .0021s (1.7x faster)
循环里没有任何其他操作。实际上Swift在这里表现不错,因为Objective-C在这个测试用例下就好比一个简单的C语言测试,注意这里的循环方式是x=x+1
自增(Increment)
Swift: 0.024s
Objective-C: 0.0023s (10.4x faster)
奇怪的是Swift ++操作有严重的性能问题,比x=x+1慢6倍。
赋值(Assign)
Swift: 0.024s
Objective-C: 0.0022s (10.9x faster)
这只是一个简单语句 x = y.
估摸着Swift使用了ARC,保留和释放一百万次带来了性能伤害。
添加字符串到数组(Append native string to native array)
Swift: 6.49s
Objective-C: 0.046s (141.1x faster)
Swift代码使用了字符串数组(Array of String). Objective-C中则是把一个NSString加到一个NSMutableArray中,没有启用优化和其他改造。而在Objective-C中使用CFMutableArrayRef还会更快,因为很多情况下,你不需要去保留那个字符串。
添加整数到数组(Append native integer to native array)
Swift: 6.51s
Objective-C: 0.023s (283x faster)
Swift代码使用了整型数组Array of Int. Objective-C使用了NSNumber和NSMutableArray
拼接字符串(Concatenate two strings)
Swift: 3.47s
Objective-C: 0.27s (21x faster)
Swift内部循环代码:
theString3 = theString + theString2
Objective-C内部循环代码:
theString3 = [theString stringByAppendingString:theString2];
兼听则明,Swift还是新生儿,需要接受开发者的考验。一个明智的策略或许是对于现有的项目,保持使用Objective C,而对于新项目,尝试性使用Swift,并让开发团队跟进Swift语言发展状况,随时学习。
- 相关文章
微信公众号在线生成二维码带参数怎么搞?
带参数二维码是微信公众号渠道二维码的一种实现
微信的带参数二维码有两种,一种是临时二维码,一种是永久二维码,但是永久二维码的生成是有个数限制的,微...OpenGL/WebGL顶点坐标变换过程简介
世界坐标是按照笛卡尔坐标系定义出来的绝对坐标系,下面的各种坐标系都建立在世界坐标的基础上。对象坐标系对象被应用于任何...
WebGL、Asm.js和WebAssembly概念简介
随着HTML技术的发展,网页要解决的问题已经远不止是简单的文本信息,而包括了更多的高性能图像处理和3D渲染方面。这正是要引入WebGL、Asm.js和WebAssembly这些技...
前端开发框架技术选型:Angular2 VS React VS jQuery
Angular和React是主流的2个前端开发框架,但是严格来说两者并非对等的概念。Angular是一个基于MVC(或者MVVM)的框架,包含model(模型)/view(视图)/controll...
CSS3弹性布局弹性流(flex-flow)属性详解和实例
弹性布局是CSS3引入的强大的布局方式,用来替代以前Web开发人员使用的一些复杂而易错hacks方法(如使用float进行类似流式布局)。其中flex-flow是flex-direction...
粒子运动模拟 - Verlet积分算法简介
Verlet算法是经典力学(牛顿力学)中的一种最为普遍的积分方法,被广泛运用在分子运动模拟(Molecular Dynamics Simulation),行星运动以及织物变形模拟等领域...
WebGL 纹理映射模式以及WRAP_S | WRAP_T参数详解
我们在纹理滤镜一文中已经说明了2个重要的纹理参数,用来定义对象缩放时纹理的处理方式:GL_TEXTURE_MIN_FILTERGL_TEXTURE_MAG_FILTER本文讲解其余几个纹理参数...
浏览器控制台报JS脚本执行错误:Module is not defined
现在JS分成了两个分支,一部分在服务器端发展如NodeJS,一部分是传统的浏览器运行环境。
有些插件在编写JS代码时,是针对Node编写的,所以直接在浏览器中使...WebGL入门教程3 - Canvas、Context、API和绘制一个矩形
jQuery Ribbles - 基于WebGL的水面涟漪动效插件
使用jQuery
SVG过滤器feColorMatrix矩阵变换效果用法详解
在计算机图形学(数学)中,矩阵乘法可用于把空间向量进行几何变换。我们可以把颜色的值(RGBA)表示成一个四维空间向量:color = (r, g, b, a);那么就可以应用...
div 、section 、article的区别和使用场景
div 、section 、article的区别和使用场景
主要区别,以及适用场合如下:
1、div在html早期版本就支持了,section和article是html5提出的两个雨衣话标... 更多...