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

日期为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)次才检查中断状态。在我的上述性能测试中,它比当前的最新master Clojure代码慢3-4%,而Colin的补丁在该测试中慢约9-10%。

0

评论者:stu

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

0

评论者:trptcolin

Andy:我认为检查Thread/interrupted次数减少的唯一问题是深层嵌套集合。

Stu:开发时间使用是打开这个问题的原始原因,是的。但我可以想象在任何可能中断线程的情况下都有可能需要它,无论是通过ctrl-c还是其他方式。

起初,从性能的角度来看,我们的想法是,一旦我们在IO中,我们可能不太会关心这种CPU密集型检查,所以我没有去管它。我想,对于SSD来说,这个假设可能不那么成立。

在我本地(带我的SSD)上,我看到Andy的打印一百万个数字的基准大约比我的原始补丁的基线慢一秒(12.08s -> 13.10s),与Andy的补丁也差不多(12.08s -> 11.75s)。减少到一千个数字并没有真正显示出任何差异(每个版本都在大约1.3s内完成)。将数字增加到两百万,我的补丁比基线高出2秒,而Andy的比基线快一点( somehow)。增加到五百万会导致我耗尽堆空间 :)

0

评论者:jafingerhut

日期为2012年11月8日的clj-1073-add-print-interruptibly-patch-v1.txt的补丁与Colin的补丁0001-Allow-thread-interruption-in-print-sequential.patch于2012年9月21日相同,只是它只在新的变量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 版本,在该代码的核心部分进行了 (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 和其他可中断场景更容易选择“安全”行为。我 personally 倾向于将“安全”行为作为默认设置,但理解性能的担忧,这让我得到了真正想要的东西。

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 报告)
...