请在2024 Clojure状态调查!上分享您的想法。

欢迎!请参阅关于页面以获取有关此功能的一些更多信息。

0
test.check
如果生成器输出的值包含尝试和时间的元数据,这将为生成测试(带有规格说明)的优化提供非常有用。
示例

(-> (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规格形式...)。它应该以合理的方式处理过于复杂的spec,即不抛出错误(与生成器一样),而最好报告规格的哪一部分过于复杂以及其元素的单独复杂性。
0

评论由:jare

此外,可能应该为每个节点(spec元素)设置超时时间(mb可配置),因为它主要是一个调试/性能分析工具。

0

评论由:gfredericks

在这里,“attempt”是什么意思?它是否仅适用于{{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 提出)
...