2016-07-24 175 views
0

真快除了字符串下面的代碼顯示了構建電子表格的方式有兩種:通過使用 :在迅速

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)) ; "); 

因此很明顯,要求追加不發生變異的字符串...

+5

我不認爲'str.append'或'Double'很慢......調用一行嵌套代碼'86400 * 80 = 6,912,000'次會讓東西看起來很慢。 –

+0

是的,我知道。這是因爲我製作了6,912,000個字符串,所以我製作了副本,分配等等...刪除了這部分(不添加,只是創建一個新的字符串)並查看運行速度快(0.043秒)。分配是這裏的殺手。所以我試圖使它成爲一個具有容量的NSMutableString,但顯然,在swift3中追加拷貝而不是變異。 – Adeline

+0

啓用優化後,「不添加,只是創建一個新的字符串」代碼將被刪除。你的代碼需要多長時間來追加常量字符串,比如'str.append(「1.23456789086756;」)'? – OOPer

回答

2

我試着將它寫入數組,並且限制因素似乎是將double轉換爲字符串。

下面的代碼發生在我的空氣

這樣

arr[i][j] = "1.23456789086756" 

13秒左右的下降而11秒吸收在雙轉換爲字符串的執行時間爲2秒。你可以通過編寫自己的轉換程序來削減一些時間,但這似乎是限制因素。我嘗試使用內存流,這似乎更慢。

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 
+0

+1 - 謝謝,即使我沒有試圖填充數組。我會再等一等,如果沒有更多的答覆,我會接受你的問題作爲最接近的答案。 – Adeline

+0

@Adeline減少它的一種方法是平行化例程 - 可能很明顯,但提到它以防萬一,在這種情況下很容易做到。如果你有一個四核心,你可以期望它下降到幾秒鐘 – daven11