Swift与Objective-C的表现

时间:2014-06-06 08:43:48

标签: objective-c swift

我只是比较SwiftObjective-C的效果。为此,我使用NSDate来测量所花费的时间,但是我在Swift和Objective-C之间有了很大的不同。我刚刚运行了一次空for循环100,000次。这是我的代码,

在Objective-C中,

NSDate * start = [NSDate date];

for (int i=0; i<=100000; i++) {

}

NSDate * end = [NSDate date];

double timeTaken = [end timeIntervalSinceDate:start] * 1000;

timeTaken是0.24毫秒

在斯威夫特,

var start = NSDate()

    for i in 0...100000

    {

    }

    var end = NSDate()

    var timeTaken = end.timeIntervalSinceDate(start) * 1000
Swift中的

timeTaken是74毫秒,与Objective-C相比,这是一个很大的不同。

我在测量中做错了吗?

6 个答案:

答案 0 :(得分:16)

你在做什么是纯粹的废话。这个循环的性能并不重要,因为它不会在实际代码中发生。本质上的区别在于,在Swift中,循环将在每个步骤执行溢出检查,这是由于语言定义所需的副作用。在Objective-C中,情况并非如此。

至少你需要做一些实际上有意义的事情的代码。

我已经完成了一些真正的测试,结果如下:1。Swift的速度和普通C的低级别操作具有可比性。 2.当发生溢出时,Swift将终止该程序,因此您可以注意到溢出,而C和Objective-C将默默地为您提供无意义的结果。试试这个:

var i: Int = 0
var s: Double = 0.0

for (i in 1 .. 10_000_000_000) { s += Double (i * i) }
斯威夫特会崩溃。 (任何认为糟糕的人都没有关于编程的线索)。 Objective-C中的相同内容将产生无意义的结果。用

替换循环
for (i in 1 .. 10_000_000_000) { s += Double (i) * Double (i) }

并且都以相当的速度运行。

答案 1 :(得分:6)

我使用sort函数进行了一些测试,该函数使用原生的Swift数组和Swift字符串与Objective C可变数组和NSString进行比较。

函数正在排序1000个字符串,它执行~milion字符串比较并且它对数组进行了洗牌。

结果如下:

  • 目标C(使用原始整数和布尔值):0.32秒

  • 目标C(使用NSNumber表示整数和布尔值):0.45秒

  • Swift在调试模式下:13秒:)

  • Swift with Optimization level(最快[-O]):1.32秒

  • Swift with Optimization level(最快,未选中[-Ofast]):0.67秒

似乎在最快的模式下,Swift与Objective C非常接近,但它仍然没有像Apple声称的那样快(编辑)。

这是我使用的排序代码:

夫特:

var strFile = String.stringWithContentsOfFile("1000strings.txt", encoding: NSUTF8StringEncoding, error: nil)
var strings:String[] = strFile!.componentsSeparatedByString("\n")
var startDate = NSDate()
var shouldLoopAgain = true
var numberOfLoops = 0
while shouldLoopAgain {
    shouldLoopAgain = false
    ++numberOfLoops
    for var i = 0; i < strings.count-1; ++i {
        if (strings[i] > strings[i+1]) {
            let temp = strings[i]
            strings[i] = strings[i+1]
            strings[i+1] = temp;
            if !shouldLoopAgain {
                shouldLoopAgain = true
            }
        }
    }
}
var time = NSDate().timeIntervalSinceDate(startDate)

目标C,带有原始布尔和整数

NSMutableArray *strings = [NSMutableArray arrayWithArray:[strFile componentsSeparatedByString:@"\n"]];
NSDate *startDate = [NSDate date];
BOOL shouldLoopAgain = YES;
int numberOfLoops = 0;
while (shouldLoopAgain) {
    shouldLoopAgain = NO;
    ++numberOfLoops;
    for (int i = 0; i < strings.count-1; ++i) {
        if ([strings[i] compare:strings[i+1]] == NSOrderedDescending) {
            NSString *temp = strings[i];
            strings[i] = strings[i+1];
            strings[i+1] = temp;
            if (!shouldLoopAgain) {
                shouldLoopAgain = YES;
            }
        }
    }
}

NSTimeInterval time = [[NSDate date] timeIntervalSinceDate:startDate];

目标C,NSNumber用于布尔和整数

NSDate *startDate = [NSDate date];
NSNumber *shouldLoopAgain = @YES;
NSNumber *numberOfLoops = @(0);
while ([shouldLoopAgain boolValue]) {
    shouldLoopAgain = @NO;
    numberOfLoops = @([numberOfLoops intValue]+1);
    for (NSNumber *i = 0; [i intValue] < strings.count-1; i = @([i intValue]+1)) {
        if ([strings[[i intValue]] compare:strings[[i intValue]+1]] == NSOrderedDescending) {
            NSString *temp = strings[[i intValue]];
            strings[[i intValue]] = strings[[i intValue]+1];
            strings[[i intValue]+1] = temp;
            if (![shouldLoopAgain boolValue]) {
                shouldLoopAgain = @YES;
            }
        }
    }
}
NSTimeInterval time = [[NSDate date] timeIntervalSinceDate:startDate];

答案 2 :(得分:5)

默认情况下,编译器优化级别在调试模式下设置为None [-Onone] ...

将此更改为Fastest [-O](如发布)会产生以下结果:

Enter image description here

答案 3 :(得分:2)

尝试在启用优化的情况下进行编译。如果这不能改变这种情况,请向Apple提交一个错误。斯威夫特仍然处于测试阶段,因此可能会出现问题。

答案 4 :(得分:2)

我不认为到目前为止你可以运行这些测试并确定Swift 1.0是否比Objective-C更快或更慢。整个Swift语言仍处于开发阶段,语法和语言方面的实现方式正在发生变化。从Xcode 6 Betas 2和3之间的语言变化可以清楚地看出,如果你看看Apple Dev论坛,你可以看到正在研究该语言的Apple人明确表示这些东西不完整或优化了直到Swift 1.0发布才会发布,这应该与Xcode 6的公开版本一起发布。

所以,我并不是说现在进行这些测试没有价值,但是在Swift 1.0最终确定之前,我们无法对最终性能做出任何结论。

答案 5 :(得分:1)

看看https://softwareengineering.stackexchange.com/questions/242816/how-can-swift-be-so-much-faster-than-objective-c-in-these-comparisonshttp://www.splasmata.com/?p=2798教程,你可能会得到答案。但主要指出Swift语言仍处于测试阶段。而且在所有情况下,苹果确实/可能不会自信地宣布Swift比objective-c更快。 Apple根据平均表现对我们说。我的观点是,如果在某些情况下obj-c比快速更快,它并不意味着swift的全部性能都比较慢。我们只是给苹果留出更多时间。