2016-11-24 15 views
1
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のように見えますか?

+2

は、あなたが実際にこれが重要な状況を持っていますか、またはこれは単に理論的なのですか? – matt

+0

また、パフォーマンスが重要である場合は、確かにメモリに直接書き込むことになります。だから私はこれが時間を浪費するものだと信じて少し苦労している。 – matt

+0

そして、あなたは実際にコンパイラに最適化を指示しましたか?もしそうでなければ、これはまったく無意味ですね。 – matt

答えて

3

フラットマップアプローチは、ループアプローチとほぼ同等です。アルゴリズム的には同等です。私は、この例ではマップ/フィルタのアプローチでさえ、文字列の操作によって実行時間の大部分が短縮されるため、「ほぼ」近い速度にすべきだと付け加えます。

パフォーマンスを向上させるには、一時的な文字列を使用しないようにします。次のように私たちは、所望の結果を達成することができます...ここで

func fastloopflatmap (_ test_array: [Int]) -> [String] { 
    var result: [String] = [] 
    for x in array { 
     if x % 10000 == 1234 { 
      result.append("string\(x)") 
     } 
    } 
    return result; 
} 

は私のタイミングです:したがって

loop  : 632 ns/element 
filter/map : 650 ns/element 
flatmap  : 632 ns/element 
fast loop : 1.2 ns/element 

、あなたが見ることができるように、遅いの運転時間の大半(99%)テンポラリ文字列の操作によるものです。

ソースコード:https://github.com/lemire/Code-used-on-Daniel-Lemire-s-blog/tree/master/extra/swift/flatmap

関連する問題