分享您的想法,参与2024 年 Clojure 状况调查!

欢迎!请查看关于页面以获取有关如何使用此页面的更多信息。

0
test.check
如果生成就值包含尝试和时间的元数据,这对于生成测试(具有规格说明)的优化非常有用。
示例

(-> (s/exercise string? 1)
    first
    meta)
;; => {:time-ms 2, :attemts 1}

它可以帮助找到运行最慢的生成器,这些生成器最能从定制中受益。

12 个回答

0
_由:_Comment_made_by: alexmiller_

我将它移动到test.check,因为生成器就在那里。

请注意,并非所有值都可以携带元数据(数字、字符串等),但这是一个有趣的想法。
0
_由:_Comment_made_by: jare_

请注意,并非所有值都可以携带元数据(数字、字符串等),但这是一个有趣的想法。

这并不是什么大问题,因为元数据将直接用于递归/嵌套规格工开发利用工具。想使用它的任何个人可以通过包装原始数据来绕过这种限制。

对于最终用户API,类似spec/explain(s/explain-data、s/explain-str等)将是很好的。
我将称之为s/complexity,该函数获取一个规格说明并返回(在s/complexity-data的情况下)与原始规格相同形状的结构,用生成复杂度数据填充(平均时间、尝试次数、mb的规格形式...)。它应该以合理的方式处理太复杂的规格,即而不是抛出(就像生成器那样),它最好报告规格的哪一部分太复杂,以及各个元素的复杂度。
0

评论者:jare

另外,可能需要为每个节点(spec元素)设置超时(可配置),因为这是一个主要用於调试/性能分析的工。”

0

评论者:gfredericks

这里的"尝试"是什么意思?这仅仅适用于{{gen/such-that}}生成器吗?

0

评论者:jare

是的,在规格说明的上下文中。生成器需要重试多少次才能成功满足规格。

0

评论者:gfredericks

我刚刚注意到这里的 {{:time-ms}} 方面,这很可能会适用于不仅仅是 {{such-that}} 。

我同意能够轻松调试生成器性能会有所帮助,但我不认为这种方法明显地可以应用于一些组合器,比如 {{gen/fmap}} 和 {{gen/bind}}。如果有一个更具体的方案,包含这类情况的细节,我会更容易考虑。

0

评论者:jare

bq. 但我不认为这种方法对于像 gen/fmap 这样的组合器是显然适用的

元数据不应该从 {{gen/fmap}} 函数内部访问。相反,函数内部消耗的时间和其它性能统计信息应该关联到 {{gen/fmap}} 的输入统计信息上,并将其附加到输出中。这样数据就会在嵌套 {{gen/}} 调用的上下文中传递。

bq. 元数据不应该从 {{gen/fmap}} 函数内部访问。

或者,您可以允许查看输入统计数据,但不允许更改它们。不确定这样做是否可行。可能太复杂了。

0
_由:_Comment_made_by: jare_

实际上,如果你允许窥视(peeking),它不仅可以用作调试,还可以用来调整性能的生成。
为了分摊累积生成器的复杂性,通过切换路由来满足某些截止日期。

- - - - -

@gfredericks 由于某种原因,我无法向任何问题添加新评论,所以我更新了旧的一个。

对于


(def g1 ...)

(def g2 (gen/fmap f g1))


 _complexity_ 函数应该输出



(complexit g1) => {:name <generator-name> :time-ms 10}

(complexit g2) => {:name :fmap :time-ms 5 :args [{:name <generator-name> :time-ms 10}]}


这里 _:time-ms 5_ 是在 _f_ 函数内耗费的时间。
0

评论者:gfredericks

例如,假设我有

`
(def g1 ...)

(def g2 (gen/fmap f g1))
`

当我从 {{g2}} 生成一个值时,我会得到什么样的信息?会是关于 {{g1}} 的,还是关于 {{f}} 的,或者是两者都以某种方式?

0

评论者:gfredericks

(链接:~JAre) 我认为你的评论权限已经修复。

好吧,我可以看出这可能是一个定义良好的概念。但这将是相当多的工作,我想要确保不会有一个重大的性能差异。如果有,我们可能需要提供一个默认关闭它的方法,并确保关闭时也不会有性能损失。

0

评论者:jare

是的,现在它工作正常了。谢谢。

0
参考:[https://clojure.atlassian.net/browse/TCHECK-153](https://clojure.atlassian.net/browse/TCHECK-153)(由 alex+import 报告)
...