评论者: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 毫秒" 使用 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
相同的测试正在运行。这次,它们都序列化了观察者。同时,时间没有明显变化。