2024 Clojure状态调查中分享您的想法!

欢迎!请参阅关于页面了解更多关于如何使用本网站的信息。

0
test.check
如果生成器输出的值包含尝试和时间的元数据,这将对生成测试(带有spec)进行优化非常有用。
示例

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

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

12 个答案

0
_由:alexmiller_做出评论

我将此问题转移到test.check,因为生成器就在那里。

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

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

这不是很大的问题,因为元数据对递归/嵌套spec的开发人员非常有用。任何希望使用它的个人可以通过包装原始数据来解决这个问题。

对于最终用户API,有类似spec/explain(s/explain-data、s/explain-str..)的会很好。
我将称之为s/complexity,该函数接受一个spec,并返回(对于s/complexity-data)形状与原始spec相同的结构,并用生成复杂度数据填充(平均时间、尝试次数、规格形式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
_由: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
by

评论者:gfredericks

例如,假设我有

`
(def g1 ...)

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

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

0
by

评论者:gfredericks

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

好的,我可以看到这可能是一个定义良好的概念。然而,这需要相当多的工作量,而且我确实想确保不会存在重大的性能差异。如果存在,我们可能希望有一个默认关闭的方式,并且确保即使在关闭时也不会影响性能。

0
by

评论者:jare

现在工作了。谢谢。

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