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,则刷新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的补丁0001-Allow-thread-interruption-in-print-sequential.patch(2012年9月21日创建)相似,但它只会在print-sequential循环中每隔20次(或可能是21次)检查中断状态。在我上述性能测试中,它的速度比最新的Clojure代码慢3-4%,而Colin的补丁在那项测试中慢约9-10%。

0

评论者:stu

这个主要是为了开发期间使用的吗?如果可能的话,我不想因此损失性能。

0

评论者:trptcolin

Andy:检查Thread/interrupted的频率更低时,唯一可能的问题是深层嵌套的集合。

Stu:是的,这原本是打开该问题的初衷。但我可以想象在任何可能中断线程的情况下都需要它,无论是通过Ctrl-C还是其他方式。

性能方面,我最初的考虑是我们已经在做I/O,可能不太关心这种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(2012年9月21日创建)的思路相同,但它只会在新变量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 的一个稍微修改过的版本,其中在代码的核心部分包含 (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 是相同的,除了它应用程序 disciplinarily 到最新的 master。

0

评论者:alexmiller

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

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