请在 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元素)设置一个超时时间(mb可配置),因为它主要是一个调试/性能分析工具。

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) (由 alex+import 报告)
...