2016-05-21 8 views
1

私はいくつかのジェネレータと任意の書き込みを行っていますが、遅すぎます(GC番号も参照)。私は自分のコードに誤りがあると思うが、どこにあるのか分からない。または私のアプローチ(map2 (fold))は "奇妙"ですか?FsCheckのスピードアップ任意の世代

ジェネレータ:

type Generators() = 

    static let notAllowed = Array.append [| '0'..'9' |] [| '\n'; '\r'; '['; ']'; '/'; |] 

    static let containsInvalidValues (s : string) = s.IndexOfAny(notAllowed) <> -1 

    static member positiveIntsGen() = Arb.generate<PositiveInt> |> Gen.map int 

    static member separatorStringGen() =       
     Arb.generate<NonEmptyString> 
     |> Gen.suchThat (fun s -> s.Get.Length < 5 && not (s.Get |> containsInvalidValues)) 

任意:

let manyNumbersNewLineCustomDelimiterStrInput = 
    Gen.map2 (fun (ints : int[]) (nes : NonEmptyString) ->    
     Array.fold (fun acc num ->     
      if num % 2 = 0 then acc + "," + num.ToString() 
      else if num % 3 = 0 then acc + "\n" + num.ToString() 
      else acc + "\n" + num.ToString()) ("//[" + nes.Get + "]\n") ints) 
     (Generators.array12OfIntsGen()) 
     (Generators.separatorStringGen()) 
    |> Arb.fromGen 

構成はMaxTest = 500を持っており、それが完了するまでに約5分かかります。 (#timerを使用して)

出力:

StrCalcTest.get_When pass an string that starts with "//[" and contains "]\n" use the multicharacter value between them as separator-Ok, passed 500 tests. 

Real: 00:07:03.467, CPU: 00:07:03.296, GC gen0: 75844, gen1: 71968, gen2: 4 

答えて

3

実際には何をテストすることなく、私の推測では、問題の一部は、このであることを次のようになります。

Arb.generate<NonEmptyString> 
|> Gen.suchThat (fun s -> s.Get.Length < 5 && not (s.Get |> containsInvalidValues)) 

これは、あなたが文字列やフィルタリングを生成することを意味します特定の条件を満たしているすべての人を排除する。しかし、条件があまりにも厳しい場合、実際にテストに合格するまでFsCheckは非常に多くの文字列を生成する必要があります。

生成するすべてが有効な文字列になるように文字列を生成するようにルールを表現できれば、より高速になるはずです。

あなたは、例えば、タイプcharn値が続く(文字列の長さのために)数nを(それがあなたの条件を満たして)生成し、セパレータ文字列を形成するためにそれらを追加してもらえますか? (私はFsCheckのgen { .. }計算がそれを書く良い方法かもしれないと思います)。

+0

あなたは正しいですよね!私は[this](http://stackoverflow.com/questions/26255550/fscheck-generating-string-with-size-between-min-max)のようなもので終わった。最後の簡単な質問:fsxファイルで静的型の中から 'Generators'を作ることが可能かどうか知っていますか?私はできません:( – Nicolocodev

+0

私は知らない - 申し訳ありません! –