import XCTest
class testTests: XCTestCase {
static func makearray() -> [Int] {
var array: [Int] = []
for x in 0..<1000000 {
array.append(x)
}
return array
}
let array = testTests.makearray()
func testPerformanceExample() {
self.measure {
var result: [String] = []
for x in self.array {
let tmp = "string\(x)"
if tmp.hasSuffix("1234") {
result.append(tmp)
}
}
print(result.count)
}
}
func testPerformanceExample2() {
self.measure {
let result = self.array.map { "string\($0)" }
.filter { $0.hasSuffix("1234") }
print(result.count)
}
}
func testPerformanceExample3() {
self.measure {
let result = self.array.flatMap { int -> String? in
let tmp = "string\(int)"
return tmp.hasSuffix("1234") ? tmp : nil
}
print(result.count)
}
}
}
在這段代碼中,我試圖看看高階函數如何處理大數組。在Swift中改進高階函數與循環的性能(3.0)
3次測試產生相同的結果,對於循環,1.38s映射/濾波器,1.21s平面映射,時間約爲0.75s。
假設HOFs或多或少是函數包裝循環,這在地圖/過濾器的情況下很有意義,它通過第一個數組循環遍歷map,然後遍歷結果過濾。
在flatmap的情況下,它是先做圖,然後再做一個更簡單的過濾操作?
我的理解是什麼在引擎蓋下(大致)正確的?
如果是這樣,說編譯器無法對此做很多優化是否公平?
最後,有沒有更好的方法來做到這一點? HOF版本對我來說絕對是更容易理解的,但對於性能關鍵領域,看起來for循環是要走的路?
你真的遇到這樣的情況該事項,或者這只是理論上的? – matt
另外,如果性能非常關鍵,那麼你肯定會直接寫入內存。所以我有點麻煩,認爲這不過是浪費時間。 – matt
你真的告訴編譯器優化嗎?如果沒有,這一切都是毫無意義的,不是嗎? – matt