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。

之前提出的另一种补丁不包括print-interruptibly,而是在打印序列的每个元素后简单地检查(Thread/interrupted)。基准测试显示这可能会将长序列的打印速度减慢约10%。拟议的补丁中的方法仅在此变量为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或其他方式。

从我最初的想法来看,在性能方面,一旦我们正在进行IO,我们可能不太关心这种CPU绑定的检查,所以我没有费心去做。我想,用SSD的情况下,这一点可能不那么适用。

本地(使用我的SSD)我注意到Andy基准测试打印一百万个数字的时间大约比我的原始补丁基线慢1秒(12.08秒 -> 13.10秒),与Andy的补丁相似(12.08秒 -> 11.75秒)。减少到一千个数字几乎看不到任何差异(每个版本都在~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
在打印过程中将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 报告)
...