以下代码显示了构建电子表格的两种方法: 使用:
str = str + "\(number) ; "
或
str.append("\(number)");
两者都非常慢,因为我认为,他们丢弃两个字符串并制作第三个字符串,这是前两个字符串的串联。 现在,如果我重复这个操作数十万次来生成一个电子表格......这会产生大量的分配。
例如,下面的代码需要11秒才能在我的MacBook Pro 2016上执行:
let start = Date()
var str = "";
for i in 0 ..< 86400
{
for j in 0 ..< 80
{
// Use either one, no difference
// str = str + "\(Double(j) * 1.23456789086756 + Double(i)) ; "
str.append("\(Double(j) * 1.23456789086756 + Double(i)) ; ");
}
str.append("\n")
}
let duration = Date().timeIntervalSinceReferenceDate - start.timeIntervalSinceReferenceDate;
print(duration);
如何在不必将双打转换为字符串的情况下解决此问题?我已经坚持了3天......我的编程技巧非常有限,你可以从上面的代码中看到......
我试过了:
var str = NSMutableString(capacity: 86400*80*20);
但是编译器告诉我:
Variable 'str' was never mutated; consider changing to 'let' constant
尽管
str.append("\(Double(j) * 1.23456789086756 + Double(i)) ; ");
显然,调用append不会改变字符串......
答案 0 :(得分:2)
我尝试将它写入数组,限制因素似乎是将double转换为字符串。
下面的代码需要13秒左右的空气
这样做
arr[i][j] = "1.23456789086756"
将执行时间减少到2秒,因此在将Double转换为String时需要11秒。您可以通过编写自己的转换例程来缩短一些时间,但这似乎是限制因素。我尝试使用内存流,这似乎更慢。
var start = Date()
var arr = Array(repeating: Array(repeating: "1.23456789086756", count: 80), count: 86400 )
var duration = Date().timeIntervalSinceReferenceDate - start.timeIntervalSinceReferenceDate;
print(duration); //0.007
start = Date()
var a = 1.23456789086756
for i in 0 ..< 86400
{
for j in 0 ..< 80
{
arr[i][j] = "\(a)" // "1.23456789086756" //String(a)
}
}
duration = Date().timeIntervalSinceReferenceDate - start.timeIntervalSinceReferenceDate;
print(duration); //13.46 or 2.3 with the string