ios – Swift vs Objective-C斐波那契序列速度比较

前端之家收集整理的这篇文章主要介绍了ios – Swift vs Objective-C斐波那契序列速度比较前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有个问题.我想知道哪一个确实更快( 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()函数要好得多.

猜你在找的iOS相关文章