我只是比较Swift和Objective-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相比,这是一个很大的不同。
我在测量中做错了吗?
答案 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]
(如发布)会产生以下结果:
答案 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-comparisons和http://www.splasmata.com/?p=2798教程,你可能会得到答案。但主要指出Swift语言仍处于测试阶段。而且在所有情况下,苹果确实/可能不会自信地宣布Swift比objective-c更快。 Apple根据平均表现对我们说。我的观点是,如果在某些情况下obj-c比快速更快,它并不意味着swift的全部性能都比较慢。我们只是给苹果留出更多时间。