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)。

之前提出的一个替代补丁没有包括 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 投票
by

stu发表的评论:

这主要用于开发阶段吗?如果可能的话,我不想因为这个而损失性能。

0 投票
by

trptcolin发表的评论:

Andy:检查Thread/interrupted频率较低的唯一缺点是我能想到的是深层嵌套的集合。

Stu:确实,打开这个的原因主要是为了开发时间的使用。但我想象得出,在可以中断线程的时候,比如通过ctrl-c或其他方式,它可能会被需要。

从性能方面考虑,我最初的想法是,一旦我们已经开始进行IO操作,我们可能不会太关注这种计算密集型的检查,所以我没管它。我想,在SSD上可能并不这么容易成立。

本地(使用我的SSD),我注意到Andy打印一百万个数字的基准大约比我的原始补丁慢1秒(12.08s -> 13.10s),在Andy的补丁上也大致相同(12.08s -> 11.75s)。降低到一千个数字实际上没有显示出太大的差异(每个版本都在约1.3秒内完成)。增加到两百万个数字,用我的补丁比基准慢2秒,而Andy的补丁比基准快一些。增加到五百万个数字则让我耗尽了堆空间:

0 投票
by

评论由: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。

通过测试.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) ...)
)
当应用补丁 0001-Allow-thread-interruption-in-print-sequential.patch
15.29 15.44 15.45 15.62 15.63


...(此处省略具体内容)
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 报告)
...