首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速FsCheck任意生成

加速FsCheck任意生成
EN

Stack Overflow用户
提问于 2016-05-21 21:37:04
回答 1查看 163关注 0票数 1

我正在编写一些生成器和任意的,但是太慢了(请参阅GC编号)。我想我的代码有错误,但我不知道在哪里。或者我的方法(map2 (fold))是“奇怪的”?

发电机:

代码语言:javascript
复制
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))

任意:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-21 22:28:46

如果不进行任何实际测试,我的猜测是有问题的部分是:

代码语言:javascript
复制
Arb.generate<NonEmptyString> 
|> Gen.suchThat (fun s -> s.Get.Length < 5 && not (s.Get |> containsInvalidValues))

这意味着您将生成字符串并过滤掉所有满足特定条件的字符串。但是,如果条件限制太大,FsCheck可能需要生成大量字符串,直到实际获得通过测试的字符串为止。

如果您可以表示规则,以便生成字符串,以便生成的都是有效字符串,那么我认为应该更快一些。

例如,您能否生成一个数字n (用于字符串长度),然后是类型为charn值(满足您的条件),然后附加它们以形成分隔符字符串?(我认为FsCheck的gen { .. }计算可能是一种很好的编写方法。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37368256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档