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可能应该具有每个节点(规范元素)的超时时间(可能可配置),因为它主要是一个调试/性能分析工具。

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_ 评论

实际上,如果您允许窥视(Peeking),那么它不仅可以用于调试,还可以用于优化性能而修改生成过程。
为了减少累积生成器复杂度,可以通过切换路由来满足某些截止日期。

- - - - -

@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 (由 alex+import 提出)
...