真快除了字符串下面的代碼顯示了構建電子表格的方式有兩種:通過使用 :在迅速
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天...我的編程技能是相當有限的,因爲你也許可以從上面的代碼中看到...
我想:
但是編譯器告訴我:
Variable 'str' was never mutated; consider changing to 'let' constant
儘管
str.append("\(Double(j) * 1.23456789086756 + Double(i)) ; ");
因此很明顯,要求追加不發生變異的字符串...
我不認爲'str.append'或'Double'很慢......調用一行嵌套代碼'86400 * 80 = 6,912,000'次會讓東西看起來很慢。 –
是的,我知道。這是因爲我製作了6,912,000個字符串,所以我製作了副本,分配等等...刪除了這部分(不添加,只是創建一個新的字符串)並查看運行速度快(0.043秒)。分配是這裏的殺手。所以我試圖使它成爲一個具有容量的NSMutableString,但顯然,在swift3中追加拷貝而不是變異。 – Adeline
啓用優化後,「不添加,只是創建一個新的字符串」代碼將被刪除。你的代碼需要多長時間來追加常量字符串,比如'str.append(「1.23456789086756;」)'? – OOPer