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文件中的编译.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次)检查一次中断状态。在我的上述性能测试中,它会比目前最新的master Clojure代码慢3-4%,而Colin的补丁在该测试中慢9-10%。

0

评论者:stu

这是否主要是为了开发时使用?如果可以将其作为开发时功能实现,我不希望为此牺牲性能。

0

评论者:trptcolin

Andy:我唯一能想到的关于减少检查Thread/interrupted频率的警告是在深层嵌套集合的情况下。

Stu:dev-time使用是这一话题最初提出的原因,是的。但我可以想象在任何线程可能被中断的情况下都需要它,无论是通过Ctrl-C还是其他方式。

最初,在性能方面,我认为一旦我们已经进行了IO,我们就不会太关心这种CPU密集型检查,所以我并没有太在意它。我想,如果一个SSD,这种情况可能就不是这样了。

在本地区域(使用我的SSD)中,我发现Andy的打印一百万个数字的基准测试比我的原始补丁的基准线慢约一秒(12.08s -> 13.10s),而Andy的补丁也大致相同(12.08s -> 11.75s)。减少到一千个数字并没有真正显示出任何差异(每个版本都在~1.3s内完成)。增加到两百万个数字,我的补丁比基准线慢2秒,而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日)是同一思路,但它只检查(Thread/interrupted),如果新的变量print-interruptibly为真。其默认值为假。

由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
假值
13.86 13.91 14.01 14.08 14.14

使用这个新的 print-interruptibly 补丁,默认值为 print-interruptibly
在打印过程中绑定到真(因此是 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 报告)
...