2024 Clojure 调研问卷! 中分享您的想法。

欢迎!请访问关于页面 了解更多此方式的工作原理。

0
test.check
如果生成器输出的值作为元数据包含尝试和所用时间,对于生成测试(具有规范)的优化非常有用。
示例

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

这有助于找出最慢的生成器,从而可以利用这些生成器的自定义设置。

12 答案

0
_Comment made by: alexmiller_

我将其移动到 test.check,因为生成器就在那里。

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

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

这不是什么大问题,因为元数据将主要对递归/嵌套规范对规范工具开发人员直接有用。并且希望使用它的人可以通过打包原语来克服这种限制。

对于最终用户API,类似于 spec/explain (s/explain-html, 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
_Comment made by: jare_

实际上,如果允许查看,它不仅可以用作调试,还可以用于根据性能调整生成。
为了简化累计生成器的复杂度,通过切换路线来满足某些截止日期。

- - - - -

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

为了


(def g1 ...)

(def g2 (gen/fmap f g1))


_complexity_ 函数应该输出



(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 报告)
...