评论者:ericnormand
我进行了一项测试,以支持我在上面提出的时效性主张。如果您运行文件 timingtest.clj,则将反复运行具有 reset! 和 swap! 的代码,使用预留 10ms 的验证器。在这种情况下,它将打印出唯一值数量(应为 reset! 的数量,本例中为 1000)和时间(使用 clojure.core/time)。时间数字与机器相关,因此不应视为绝对值。相反,重要的是它们之间的比率。
运行方式:java -cp clojure-1.7.0-master-SNAPSHOT.jar clojure.main timingtest.clj
结果
现有实现
"经过时间:1265.228 毫秒" Using reset! 的唯一数量:140 "经过时间:11609.686 毫秒" 使用 swap! 的唯一数量:1000 "经过时间:7010.132 毫秒" 使用 swap! 和 reset! 的唯一数量:628
请注意,行为不同:swap! 序列化了监视器,reset! 不会(1. of 唯一)。
建议的实现
"经过时间:1268.778 毫秒" 使用 reset! 的唯一数量:1000 "经过时间:11716.678 毫秒" 使用 swap! 的唯一数量:1000 "经过时间:7015.994 毫秒" 使用 swap! 和 reset! 的唯一数量:1000
相同的测试再次运行。这次,它们都序列化了监视器。此外,时间没有显著变化。