我刚刚在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中的某些功能对于执行效果至关重要.以此功能为例:
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()函数要好得多.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。