2024 年 Clojure 调查问卷! 中分享您的想法。

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

0
打印

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

有关 clojure-dev 讨论请参阅 https://groups.google.com/d/topic/clojure-dev/vs0RNUQXiYE/discussion

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

方法

添加一个新变量 print-interruptibly,类似于 print-lengthprint-dup 等。默认为 false。当为 true 时,在打印序列中的每个元素后检查 (Thread/interrupted)。如果是 true,则刷新 writer 并抛出 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 的频率是否有任何负面影响?

要运行性能测试,请编辑附件 compile.sh 中的 clojure.jar,将文件 perftest-print.clj 放入同一目录中,并运行 ./compile.sh。它应在 Mac 或 Linux 上正常工作。

0

评论者:jafingerhut

clj-1073-allow-thread-interrupt-in-print-sequential-patch.txt 文件,日期为2012年9月22日,与Colin于2012年9月21日提供的补丁0001-Allow-thread-interruption-in-print-sequential.patch类似,不同之处在于它只在前20次(或可能21次)遍历时检查被中断状态。在我的性能测试中,这个版本比目前的最新master Clojure代码慢了3-4%,而Colin的补丁在该测试中慢了约9-10%。

0

评论者:stu

这是主要用于开发时间使用吗?如果有可能以开发时间特性实现,我不希望因此而损失性能。

0

评论者:trptcolin

Andy:我认为检查Thread/interrupted更少的唯一缺点可能出现在深深嵌套的集合中。

Stu:是的,open这个话题的初衷是开发时间使用。但我想象到它可能会在任何线程可以被中断的时候使用,无论是通过Ctrl+C还是其他方式。

从性能角度来看,我最初的思路是,一旦我们正在进行I/O,我们就不会太过担心像这样的CPU密集型检查,所以我并没有关心它。我想,有了SSD,这一点可能就不太准确了。

在我这个本地(我的SSD上),我注意到Andy的基准测试(打印一百万个数字)比我的原始补丁基线慢了一秒左右(12.08秒 -> 13.10秒),而与Andy的补丁相比,耗时基本相同(12.08秒 -> 11.75秒)。减少到一千个数字并没有真正显示出任何差异(所有版本都完成在约1.3秒)。增加到两百万个数字,比我补丁的基线增加了2秒,而Andy的则比基线略快(某种方式)。增加到五百万个数字则使我耗尽堆空间:)

0

评论者:jafingerhut

clj-1073-add-print-interruptibly-patch-v1.txt 文件,日期为2012年11月8日,与Colin于2012年9月21日提供的补丁0001-Allow-thread-interruption-in-print-sequential.patch思路相同,不同之处在于它只检查(Thread/interrupted)如果新的变量print-interruptibly为真。它的默认值为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,它通过 (binding (link: 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
by

评论者:trptcolin

Andy 的最新补丁看起来很好,并使 REPL 和其他可中断场景能够选择“安全”行为。我更希望“安全”默认开启,但可以理解对性能的担忧,这个补钉让我得到了真正想要的东西。

0
by

留言者:halgari

审查:由于看起来性能问题已经得到解决。

0
by

评论者:jafingerhut

2013 年 2 月 12 日的 clj-1073-add-print-interruptibly-patch-v2.txt 与 2012 年 11 月 8 日的 clj-1073-add-print-interruptibly-patch-v1.txt 相同,只是它能干净地应用到最新的 master 上(即将删除)。

0
by

留言者:alexmiller

将其重新归类为已审查,因为 Rich 尚未审查。

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