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つのテストでは、ループの約0.75秒、1.38秒のマップ/フィルタ、1.21秒のフラットマップで同じ結果が得られます。
HOFは多かれ少なかれラップループ機能を持っていると仮定すると、これはマップ/フィルタの場合と同様に意味があります。マップの最初の配列をループして、その結果をループしてフィルタリングします。
フラットマップの場合は、マップを最初に実行してから、簡単なフィルタ操作を実行できますか?
フードの下で何が起きているのか、私の理解は正しいですか?
もしそうなら、コンパイラはこれをあまり最適化することができないと言うのは公正だろうか?
最後に、これを行う良い方法がありますか? HOFのバージョンは間違いなく理解しやすいですが、パフォーマンスが重要な分野では、for-loopsのように見えますか?
は、あなたが実際にこれが重要な状況を持っていますか、またはこれは単に理論的なのですか? – matt
また、パフォーマンスが重要である場合は、確かにメモリに直接書き込むことになります。だから私はこれが時間を浪費するものだと信じて少し苦労している。 – matt
そして、あなたは実際にコンパイラに最適化を指示しましたか?もしそうでなければ、これはまったく無意味ですね。 – matt