我有个问题.我想知道哪一个确实更快(
Swift或Objective-C),因为当我开始开发应用程序时,我想选择一个更快/更好的.据许多消息来源(例如苹果的WWDC或
http://www.jessesquires.com/apples-to-apples-part-two/),Swift假设要更快.
我刚刚在Swift和Objective-C中写了一个简单的递归斐波纳契序列程序.
然而,当我在模拟器上运行fib(35)时,我会获得令人惊讶的结果:
目标C结果:
::: fib :::: 9227465 ::: duration ::: 0.122813秒
快速结果
::: fib :::: 9227465 ::: duration ::: 0.606831073760986秒
现在,我甚至在所有Swift编译器优化级别(用于调试)中运行Swift版本,它是None,Fastest,Fastest-Unchecked.我也玩代码生成优化级别为无,快速….最快的进取优化.
然而,所有Swift的结果都接近0.6毫秒
现在我可以想到的最后一件事可能是,我正在将苹果与橙子进行比较?
你们看到我在这里失踪的东西吗?除了Swfit编译器和Apple LLVM代码生成的优化级别之外,还有什么其他功能可以使Swift程序运行得更快吗?
任何建议或意见欢迎和赞赏! ^^!
Objective-C版本
-(int)fib:(int)num{ if (num == 0) { return 0; } if (num == 1) { return 1; } return [self fib:num - 1] + [self fib:num - 2]; }
Swift版本
func fib(num: Int) -> Int{ if(num == 0){ return 0; } if(num == 1){ return 1; } return fib(num - 1) + fib(num - 2); }
Objective-C时间测量
NSTimeInterval start = [[NSDate date] timeIntervalSince1970]; int result = [self fib:35]; NSTimeInterval end = [[NSDate date] timeIntervalSince1970]; NSTimeInterval duration = end - start; NSLog(@":::fib::::%d:::duration:::%f",result,duration);
快速时间测量
var start = NSDate().timeIntervalSince1970; let result = fib(35); var end = NSDate().timeIntervalSince1970; var duration = end - start; println(":::fib::::\(result) :::duration:::\(duration)");
解决方法
在决定两种编程语言中哪一种更快时,需要考虑的很多事情.我在Swift和Objective-C之间做了几个基准(
https://github.com/vsco/swift-benchmarks),我发现在某些情况下,Swift更快,在其他情况下,Objective-C更快.例如,如果您需要对大量数据进行操作,则在Swift中使用结构对象将提供巨大的性能提升.相比之下,使用非Swift对象,Swift显着慢于Objective-C对等体.
此外,您如何使用Swift中的某些功能对于执行效果至关重要.以此功能为例:
class func shuffleGenericObjects<T>(inout array:[T]) { for (var i = 0; i < array.count; i++) { let currentObject: T = array[i] let randomIndex = Int(arc4random()) % array.count let randomObject: T = array[randomIndex] array[i] = randomObject; array[randomIndex] = currentObject } }
当然,它可以很好的减少重复的代码,但是当我执行这个方法超过100万Int对象,大概需要32秒完成.反对非通用实现,只有0.181秒.
我还建议不要在Swift中使用NSDate函数进行基准测试.我遇到了一些导致NSDate返回错误时间的错误.将您的基准测试放在XCTestCase中并使用measureBlock()函数要好得多.