评论者:ericnormand
我进行了一个测试,以支持我上面提出的时序声明。如果您运行文件 timingtest.clj,它将以每次 10ms 睡眠的验证器,不断执行带有 reset! 和 swap! 的代码。在这种情况下,它将打印出唯一的数量(应为 reset! 的数量,在这种情况下为 1000)和时间(使用 clojure.core/time)。时间值相对于机器,不应被视为绝对的。相反,重要的是它们之间的比率。
运行方式:java -cp clojure-1.7.0-master-SNAPSHOT.jar clojure.main timingtest.clj
结果
现有实现
"执行时间:1265.228 毫秒" 使用 reset! 的唯一值:140 "执行时间:11609.686 毫秒" 使用 swap! 的唯一值:1000 "执行时间:7010.132 毫秒" 使用 swap! 和 reset! 的唯一值:628
请注意,行为不同:swap! 序列化了观察者,reset! 没有(唯一的 1)。
建议的实现
"执行时间:1268.778 毫秒" 使用 reset! 的唯一值:1000 "执行时间:11716.678 毫秒" 使用 swap! 的唯一值:1000 "执行时间:7015.994 毫秒" 使用 swap! 和 reset! 的唯一值:1000
进行相同测试。这次,它们都序列化了观察者。时间没有显著变化。