- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 clojure.spec
解析 DSL。不幸的是,测试是否符合我的规范的计算时间似乎呈指数增长。我想了解原因,以及如何解决。
这是规范的样子:
(spec/def ::settings map?)
(spec/def ::header (spec/spec
(spec/cat :prefix #{:begin-example}
:label string?
:settings (spec/? ::settings))))
(def end-block [:end-example])
(spec/def ::not-end (partial not= end-block))
(spec/def ::end #{end-block})
(spec/def ::block (spec/cat
:header ::header
:data (spec/* ::not-end)
:suffix ::end))
(spec/def ::form (spec/alt :block ::block
:form any?))
(spec/def ::forms (spec/* ::form))
(defn make-sample-data [size]
(transduce
(comp (take size)
cat)
conj
[]
(repeat [:a 1 :b :c [:begin-example "a" {:indent 4}] :d :e [:end-example] 9])))
(make-sample-data 1)
;; => [:a 1 :b :c [:begin-example "a" {:indent 4}] :d :e [:end-example] 9]
(make-sample-data 2)
;; => [:a 1 :b :c [:begin-example "a" {:indent 4}] :d :e [:end-example] 9 :a 1 :b :c [:begin-example "a" {:indent 4}] :d :e [:end-example] 9]
(dotimes [i 13]
(assert (time (spec/valid? ::forms (make-sample-data i)))))
"Elapsed time: 0.077095 msecs"
"Elapsed time: 0.333636 msecs"
"Elapsed time: 0.864481 msecs"
"Elapsed time: 2.198994 msecs"
"Elapsed time: 4.432004 msecs"
"Elapsed time: 9.026142 msecs"
"Elapsed time: 17.709151 msecs"
"Elapsed time: 35.201316 msecs"
"Elapsed time: 73.178516 msecs"
"Elapsed time: 138.93966 msecs"
"Elapsed time: 288.349616 msecs"
"Elapsed time: 569.471181 msecs"
"Elapsed time: 1162.944497 msecs"
最佳答案
我猜测性能问题来自贪婪的分支正则表达式规范与 any?
的组合。谓词。any?
的使用在 s/alt :form
regex 分支对我来说很突出。我想规范可能正在评估 s/alt
的每个分支贪婪地/穷尽地然后回溯,和 any?
匹配所有内容,包括与您的 :block
匹配的值分支。 (请注意,无论 :form any?
分支是在 :block
分支之前还是之后定义,规范都符合。)
如果您可以使用比 any?
更具体的谓词在您的顶级 s/alt :form
分支,您应该会看到很大的改进。为简洁起见,我内联了规范定义:
(s/def ::forms
(s/*
(s/alt :block
(s/cat :header (s/spec
(s/cat :prefix #{:begin-example}
:label string?
:settings (s/? map?)))
:data (s/* #(not= % [:end-example]))
:suffix #{[:end-example]})
:form
(s/nonconforming ;; don't tag results
(s/or :keyword keyword?
:number number?)))))
(time (s/valid? ::forms (make-sample-data 1000)))
"Elapsed time: 84.637513 msecs"
=> true
coll?
、
vector?
)到该
:form
分支会像
any?
一样降低性能.我想这是因为相同的值匹配
s/alt
的两个分支.
关于clojure - 规范/有效期的评估时间?呈指数增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54461834/
有谁知道 OAuth 访问 token 的有效期是多少? 最佳答案 这取决于提供商,但在大多数情况下,它在帐户持有人撤销您的访问权限之前一直有效。 例如 Twitter - 它不会过期,但用户可以撤销
这是我在 xamarin 表单开发中用于 google 身份验证的代码,身份验证后我得到了 sid 和 token token ,但 token 生命周期几乎不到 1 小时。有什么办法可以增加 tok
好的,所以我刚刚深入研究了 Android 的 C2DM 服务,它工作得很好,或者我必须说超快。现在我开始开发将在服务器上处理客户端注册 ID 的 Web 服务,有人可以告诉我: 注册 ID 的有效期
我有一个 PayPal 企业帐户。我生成了一个 API 用户名、密码和签名,并从以前制作的网站复制了一些 PHP 代码,该网站将处理表单上的支付字段。 在以前制作的网站中,一切运行良好,直到今天。但是
缩略图URL中包含参数。我不知道为什么。我认为它们与我们正在使用的缩略图或Boto存储有关。 如何从URL中删除其他参数? 它们来自boto / s3还是sorl。 我不知道如何调试。 最佳答案 用途
我是一名优秀的程序员,十分优秀!