use*_*324 18 objective-c swift
我只是比较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;
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)
并且都以相当的速度运行.
我做了一些使用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)
| 归档时间: |
|
| 查看次数: |
18093 次 |
| 最近记录: |