请在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

方法

添加一个新的var 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次?)通过print-sequential循环时检查中断状态。在我的上述性能测试中,它的性能比目前最新的Clojure主代码慢3-4%,而Colin的补丁在此测试中慢9-10%。

0
by

评论者:stu

这是主要用于开发时使用的吗?如果有的话,我不想因为这个而失去性能。

0
by

评论者:trptcolin

Andy:我认为检查Thread/interrupted频率较低的唯一问题是深层嵌套集合。

Stu:是的,开发时间使用是打开这个问题的初衷。但我可以想象,如果线程可以被中断,无论是通过Ctrl-C还是其他手段,它可能在任何时候都需要它。

最初在我的观点中,如果我们已经在做IO,我们可能不太关注这种类型的CPU-bound检查,所以我没有去麻烦。也许在SSD上这不会那么有效。

在我本地(使用我的SSD)上,我看到Andy打印一百万个数字的基准测试比我的原始补丁基准线慢约一秒(12.08s -> 13.10s),与Andy的补丁情况相似(12.08s -> 11.75s)。减少到一千个数字实际上并没有显示出任何差异(每个版本的完成时间都在约1.3s)。增加到两百万个数字,我的补丁比基准线慢了两秒,而Andy的补丁则略快于基准线(有些方法)。增加到五百万会让我耗尽堆空间:)

0
by

评论者:jafingerhut

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

使用这个新的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

评论者:trptcolin

Andy最新的补丁看起来不错,使得REPL和其他可中断场景能够选择“安全”的行为。我个人更希望默认勾选“安全”行为,但我能理解性能方面的担忧,而且这样我已经得到了我真正想要的。

0

评论人:halgari

经过审查,因为听起来性能问题已得到解决。

0

评论者: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

评论人:alexmiller

回到Triaged状态,因为Rich还没有审查。

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