Swift与Objective-C的表现

use*_*324 18 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;
Run Code Online (Sandbox Code Playgroud)

timeTaken是0.24毫秒

在斯威夫特,

var start = NSDate()

    for i in 0...100000

    {

    }

    var end = NSDate()

    var timeTaken = end.timeIntervalSinceDate(start) * 1000
Run Code Online (Sandbox Code Playgroud)

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

我在测量中做错了吗?

gna*_*729 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) }
Run Code Online (Sandbox Code Playgroud)

斯威夫特会崩溃.(任何认为糟糕的人都没有关于编程的线索).Objective-C中的相同内容将产生无意义的结果.用.替换循环

for (i in 1 .. 10_000_000_000) { s += Double (i) * Double (i) }
Run Code Online (Sandbox Code Playgroud)

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

  • `斯威夫特会崩溃.(任何认为糟糕的人都不会对编程有所了解.)我会说任何进行如此全面概括的人都不了解他们自己的直接经验领域之外的编程... :-) (9认同)
  • 我不说我在做什么是胡说八道.我知道这不是一个常见的用例.由于存在很大差异,我的实际问题是"我在测量中做错了吗?" 因为我是目标c和swift的新手. (5认同)
  • "斯威夫特会崩溃.(任何认为糟糕的人都不会对编程有所了解." 实际上它恰恰相反......斯威夫特不应该只是"崩溃".它应该停止运行生成详细的错误消息,以帮助您追踪问题.这可能是发生的事情,在这种情况下你应该重新措辞该句子,因为"崩溃"一词通常不是指默认提供许多有用诊断的行为(例如"分段错误"). (5认同)
  • 那么你对OP的巨大差异有什么结论呢?"你的测量不是一个真实的案例"并不能解决这个问题. (2认同)

Mat*_*mar 6

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

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

结果如下:

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

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

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

  • Swift与优化级别(最快[-O]):1.32秒

  • Swift与优化级别(最快,未选中[-Ofast]):0.67秒

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

这是我使用的排序代码:

迅速:

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)
Run Code Online (Sandbox Code Playgroud)

Objective 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];
Run Code Online (Sandbox Code Playgroud)

具有NSNumber的Objective C用于布尔和整数

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];
Run Code Online (Sandbox Code Playgroud)


lia*_*ols 5

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

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

在此输入图像描述


Cat*_*Man 2

尝试在启用优化的情况下进行编译。如果这不能改变情况,请向 Apple 提交错误。Swift 仍处于测试阶段,因此可能存在一些问题。

  • 比预期慢绝对算作一个错误! (7认同)