我有一个使用ProcessBuilder来调用unixsorting命令的java程序。 当我在我的IDE(intelliJ)中运行这个代码时,只需要大约一秒来sorting500,000行。 当我将它打包成一个可执行的jar文件,并从terminal运行它大约需要10秒。 当我从terminal自己运行sorting命令时,需要20秒!
为什么在性能方面的巨大差异,以及我可以通过任何方式让jar来执行相同的性能? 环境是OSX 10.6.8和java 1.6.0_26。 sorting手册页的底部显示“2004年11月5.93sorting”
它正在执行的命令是:
sort -t' ' -k5,5f -k4,4f -k1,1n /path/to/imput/file -o /path/to/output/file
请注意,当我从terminal运行sorting我需要手动转义制表符分隔符和使用参数-t$'\t'
而不是实际的选项卡(我可以传递给ProcessBuilder)。
看起来ps
一切似乎都是一样的,除了从IDE运行sorting命令有一个TTY? 而不是ttys000 – 但从这个问题,我不认为这应该有所作为。 也许BASH在减慢我的速度? 我正在用尽想法,想closures这个20倍的性能差距!
我要冒两个猜测:
也许你正在调用不同版本的排序(做一个which sort
并使用完全绝对路径来进行recompare?)
也许你正在使用更复杂的区域设置(导致更复杂的字符集处理等)? 尝试
export LANG=C sort -t' ' -k5,5f -k4,4f -k1,1n /input/file -o /output/file
比较
看看这个项目: http : //code.google.com/p/externalsortinginjava/
避免需要完全调用外部排序。