2024 Clojure 状态调查!中分享您的想法。

欢迎!有关如何操作的更多信息,请参阅关于页面。

0
打印

这允许 print-sequential 通过 Thread.interrupt() 被中断,而不是要求客户端求助于 Thread.stop()。当打印非常大的序列时,这非常有用。

另请参阅https://groups.google.com/d/topic/clojure-dev/vs0RNUQXiYE/discussion上的 clojure-dev 讨论。

补丁: clj-1073-add-print-interruptibly-patch-v2.txt

方法

添加一个新的变量 print-interruptibly,类似于 print-lengthprint-dup 等。默认值为 false。当为 true 时,在打印序列的每个元素之后检查 (Thread/interrupted)。如果是 true,则刷新写入器并抛出 InterruptedIOException。

之前提出的另一个补丁没有包含 print-interruptibly,而是在打印序列的每个元素之后简单地总是检查 (Thread/interrupted)。基准测试表明,这可能会使长序列的打印速度降低约 10%。建议补丁中的方法仅在 print-interruptibly 为 true 的时候才会引起这种降低。当为 false 时,基准测试中没有测量到显著的降低。

10 个答案

0

由 jafingerhut 发布的评论

在我对 Mac OS X 10.6.8 + Oracle/Apple JDK 1.6.0_35 的快速性能测试中,我发现 Colin 的补丁在打印大向量时速度降低约为 9% 到 10%。

我有一个修改过的补丁,它仅在每打印 20 项后调用 Thread/interrupted,而使用这个版本,与原始代码相比,速度降低约 3% 到 4%。

Colin,对于您的目的来说,是否检查 Thread/interrupted 的频率更少会有任何缺点?

要运行性能测试,请编辑 attachment 中的 compile.sh 以指向您的 clojure.jar,将文件 perftest-print.clj 放在同一目录中,并运行 ./compile.sh。它应该在 Mac 或 Linux 上运行。

0

由 jafingerhut 发布的评论

日期为2012年9月22日的clj-1073-allow-thread-interrupt-in-print-sequential-patch.txt与Colin的2012年9月21日的补丁0001-Allow-thread-interruption-in-print-sequential.patch相似,除了它只在print-sequential循环中每20次(或可能21次)检查中断状态。在我的性能测试中,它与目前最新的Clojure主代码相比慢了3-4%,而Colin的补丁在那个测试中大约慢9-10%。

0

评论者:stu

这个是否主要针对开发时间使用?如果可能,我希望不要因为这个特性而牺牲性能。

0

评论者:trptcolin

Andy:唯一可以想到的不足在于,如果检查Thread/interrupted的频率较低,可能会在深度嵌套集合的情况下出现问题。

stu:是的,最初提出这个问题的原因是开发时间使用。但我可以想象,在某个线程可以被中断的情况下,无论是通过Ctrl+C还是其他方式,都可能需要这个功能。

我最初在性能方面的想法是,既然我们已经在做I/O,那么我们可能不太关心这个像CPU-bound检查这样的问题,所以我没有去处理它。我想,有了SSD,情况可能就不是这样了。

在我本地(使用SSD)的情况下,我发现Andy打印一百万个数字的基准测试比我的原始补丁基线慢了一秒钟(12.08s变成13.10s),与Andy的补丁大致相同(12.08s变成11.75s)。减少到一千个数字,实际上没有显示任何差异(每个版本都完成在~1.3s)。增加到两百万个数字,使用我的补丁比基线增加了2秒,而Andy的补丁又比基线快一点(某种原因)。增加到五百万个数字将使我耗尽堆空间 :)。

0

由 jafingerhut 发布的评论

日期为2012年11月8日的clj-1073-add-print-interruptibly-patch-v1.txt与Colin的2012年9月21日的补丁0001-Allow-thread-interruption-in-print-sequential.patch的思路相同,不同之处在于它只有在新的变量*print-interruptibly*为true的时候才检查(Thread/interrupted)。其默认值为false。

使用test.sh脚本驱动的perftest-print.clj程序的性能结果,针对Clojure 1.5-beta1和两个不同的补丁。所有运行时间均为已过去的时间(秒),按递增顺序排序,方便比较。

摘要:当将print-interruptibly保留为默认的false值时,性能结果与现在基本相同。将print-interruptibly绑定到true时,性能结果比预期慢,与Colin的补丁差不多。

原始1.5-beta1未改变
13.75 13.80 13.83 13.87 13.93

使用这个新的print-interruptibly补丁,当拥有print-interruptibly
默认值为false
13.86 13.91 14.01 14.08 14.14

使用这个新的print-interruptibly补丁,当拥有print-interruptibly
在打印时绑定到true(因此perftest-print.clj的一个略作修改的版本,在代码的核心部分四周使用(bindings print-interruptibly true)
...

15.29 15.44 15.45 15.62 15.63

应用补丁0001-Allow-thread-interruption-in-print-sequential.patch
之后
15.38 15.46 15.48 15.49 15.50

0

评论者:trptcolin

Andy的最新补丁看起来不错,并且使REPL和其他可中断场景轻松选择“安全”行为。我个人更希望默认启用“安全”行为,但理解性能问题,并且这让我得到了真正想要的。

0

评论者:halgari

根据性能问题得到解决,进行审查。

0

由 jafingerhut 发布的评论

clj-1073-add-print-interruptibly-patch-v2.txt于2013年2月12日与clj-1073-add-print-interruptibly-patch-v1.txt于2012年11月8日(即将被删除)相同,只是它适用于最新的master。

0

评论者:alexmiller

由于Rich尚未审查,重新归类为Triaged。

0
参考资料:https://clojure.atlassian.net/browse/CLJ-1073 (由trptcolin报告)
...