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,则刷新写入器并抛出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的频率对您的用途有缺点吗?

要运行性能测试,请编辑编译.sh并将其指向您的clojure.jar,将文件perftest-print.clj放在同一目录中,然后运行 ./compile.sh。它应该在Mac或Linux上工作。

0 投票

评论者:jafingerhut

2012年9月22日发布的 clj-1073-allow-thread-interrupt-in-print-sequential-patch.txt 与2012年9月21日发布的Colin的补丁 0001-Allow-thread-interruption-in-print-sequential.patch 相似,区别在于它仅在 print-sequential 的循环中每隔20(或可能是21)次检查中断状态。在我的上述性能测试中,它与当前最新的主Clojure代码相比慢了3-4%,而Colin的补丁在该测试中慢了约9-10%。

0 投票

学生发表的评论:

这个主要是为了在开发时间使用吗?如果可能的话,我希望不要因为这样而损失性能。

0 投票

trptcolin 的评论:

Andy:我唯一能想到的 watches Thread/interrupted 更少的情况是深层嵌套集合。

Stu:是的, dev-time use 是这个问题最初提出的理由。但我可以想象,无论何时线程可能被中断,无论是通过Ctrl-C还是其他方式,都需要它。

在性能方面,我最初的想法是,既然我们已经在做IO,我们就可能不太关心这种CPU-bound的检查,所以我懒得检查它。我猜使用SSD时,这可能就不是那么真实了。

在我本地(使用我的SSD)上,我发现Andy打印一百万个数字的基准测试比我的原始补丁基线慢约一秒(12.08s -> 13.10s),并且与Andy的补丁时间相同(12.08s -> 11.75s)。减少到一千个数字并没有真正显示出任何差异(每个版本都在~1.3s内完成)。将数字增加到两百万,我的补丁比基线高出2秒,而Andy的补丁则略快于基线(某种方式)。将数字增加到五百万将使我耗尽堆空间 :)。

0 投票

评论者:jafingerhut

2012年11月8日发布的 clj-1073-add-print-interruptibly-patch-v1.txt 与2012年9月21日发布的Colin的补丁 0001-Allow-thread-interruption-in-print-sequential.patch 的想法相同,区别在于它仅在有一个新变量 print-interruptibly 为 true 时检查(Thread/interrupted)。其默认值为 false。

perftest-print.clj 程序的性能结果,由 test.sh 脚本驱动,针对 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的一个略作修改的版本,在代码核心部分周围进行了绑定(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 投票
Andy的最新补丁看起来不错,并使得REPL和其他可中断场景能够选择“安全”的行为。我本人更希望默认打开“安全”行为,但也理解性能的担忧,这个补丁可以满足我真正的需求。

trptcolin 的评论:

0 投票
)回答

由:halgari发表评论

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

0 投票

评论者:jafingerhut

clj-1073-add-print-interruptibly-patch-v2.txt(2013年2月12日)与clj-1073-add-print-interruptibly-patch-v1.txt(2012年11月8日)相同,除了它可以干净地应用到最新的master上(即将被删除)。

0 投票

由:alexmiller发表评论

将问题回退到划分优先级状态,因为Rich尚未审查。

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