请在 2024 年 Clojure 状况调查! 中分享您的想法。

欢迎!请查看 关于 页面以了解有关此信息的更多信息。

0
test.check
如果生成器输出的值包含尝试和时间的元数据,这将有助于优化生成测试(具有规范)。
示例

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

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

12 个答案

0
_由 alexmiller 评论:

我将此移至 test.check,因为生成器就在那里。

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

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

这不是什么大问题,因为元数据将主要用于递归/嵌套规范的工具开发者。而那些想要使用它的人可以通过包装原始数据来克服这个限制。

对于最终用户API,类似 spec/explain(s/explain-data, s/explain-str..) 的功能会很棒。
我将称之为 s/complexity,该函数接受一个规范,并返回一个与原始规范形状相同(在 s/complexity-data 的情况下)的结构,其中填充了生成复杂性数据(平均时间、尝试次数、MB 规范形式等)。它应该以合理的方式处理过于复杂的规范,即,而不是抛出错误(如生成器那样),它最好是报告规范的哪个部分过于复杂以及它的各个元素的复杂性。
0

评论者:jare

另外,s/complexity可能应该对于每个节点(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
_由 jare_ 评论:

实际上,如果你允许侦察,它不仅可以用于调试,还可以用于性能改进的生成。
为了平摊累积生成器的复杂性,通过切换路由来满足某些截止日期。

- - - - -

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

对于


(def g1 ...)

(def g2 (gen/fmap f g1))


 _复杂度_ 函数应输出



(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 提出)
...