请分享您的想法,参加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,则刷新写入器并抛出InterruptedIOException。

之前提出的一个替代补丁没有包含印 interruptibly,而是简单地总是检查在打印序列中的每个元素之后是否为(Thread/interrupted)。基准测试表明,这可能会使长序列的打印速度减慢约10%。建议的补丁中的这种方法只有在印 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的补丁0001-Allow-thread-interruption-in-print-sequential.patch相同,日期为2012年9月21日,不同之处在于它只在内循环中每隔20次(或可能是21次)检查中断状态。在我的性能测试中,这比当前最新主Clojure代码慢3-4%,而Colin的补丁在该测试中慢约9-10%。

0

评论者:stu

这是否主要用于开发时间使用?如果可以通过开发时间特性来实现,我希望不要因为这个而失去性能。

0

评论者:trptcolin

Andy:我认为检查Thread/interrupted更少的情况下的唯一注意事项是深层嵌套的集合。

Stu:是的,最初的目的是出于开发时间使用考虑而开启这个议题。但我可以想象在任何线程可能被中断的情况下,比如由Ctrl-C或其他方式,都需要它。

在性能方面,我的最初想法是,一旦我们正在进行IO,我们可能不会太关心CPU相关的检查,所以我没去麻烦此事。我想,在一个SSD上,这可能不再适用。

本地(与我的SSD一起),我发现Andy打印一百万个数字的基线比我的原始补丁慢约一秒(12.08s -> 13.10s),用Andy的补丁也是一样(12.08s -> 11.75s)。减少到一千个数字并没有显示任何差异(所有版本都在约1.3秒内完成)。增加到两百万个数字,用我的补丁比基线慢两秒,而Andy的补丁再次略快于基线(不知怎的)。增加到五百万个数字将使我耗尽堆空间:)

0

由jafingerhut发表的评论:

名为clj-1073-add-print-interruptibly-patch-v1.txt,日期为2012年11月8日,与Colin的补丁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 补丁,-with print-interruptibly
默认为 false
13.86 13.91 14.01 14.08 14.14

借助这个新的 print-interruptibly 补丁,-with 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发表的评论:

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

0
by

评论者:alexmiller

返回到 Triaged,因为 Rich 尚未审查。

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