私はいくつかのジェネレータと任意の書き込みを行っていますが、遅すぎます(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
あなたは正しいですよね!私は[this](http://stackoverflow.com/questions/26255550/fscheck-generating-string-with-size-between-min-max)のようなもので終わった。最後の簡単な質問:fsxファイルで静的型の中から 'Generators'を作ることが可能かどうか知っていますか?私はできません:( – Nicolocodev
私は知らない - 申し訳ありません! –