我有一个java程序,它使用ProcessBuilder调用unix排序命令。当我在IDE (intelllij)中运行这段代码时,对500,000行进行排序只需要大约一秒钟。当我将它打包到一个可执行的jar中,并从终端运行它时,大约需要10秒。当我自己从终端运行排序命令时,它需要20秒!
为什么在性能上有如此大的差异,我有什么方法可以让jar以相同的性能执行?环境为OSX 10.6.8, java 1.6.0_26。排序手册页底部显示"sort 5.93十一月2004"
它正在执行的命令是:
sort -t' ' -k5,5f -k4,4f -k1,1n /path/to/imput/file -o /path/to/output/file
请注意,当我从终端运行sort时,我需要手动转义制表符分隔符并使用参数-t$'t'
而不是实际的制表符(我可以将其传递给ProcessBuilder)。
看着ps
一切似乎都是一样的,除了从IDE运行排序命令有一个TTY ??而不是ttys000——但从这个问题来看,我认为这不会有什么不同。也许是巴斯拖了我的后腿?我已经黔驴技穷,想要缩小这20倍的性能差距!
我将大胆猜测两种情况:
-
也许你正在调用不同版本的排序(做一个
which sort
并使用完整的绝对路径来重新比较?) -
也许你正在使用更复杂的语言环境设置(导致更复杂的字符集处理等)?试着
export LANG=C sort -t' ' -k5,5f -k4,4f -k1,1n /input/file -o /output/file
看看这个项目:http://code.google.com/p/externalsortinginjava/
完全避免调用外部排序。