我有一个使用 ProcessBuilder 调用 unix 排序命令的 java 程序。当我在我的 IDE (intelliJ) 中运行此代码时,只需大约一秒钟即可对 500,000 行进行排序。当我将它打包到一个可执行 jar 中并从终端运行它时,大约需要 10 秒。当我自己从终端运行排序命令时,需要 20 秒!
为什么性能上存在巨大差异以及我可以让 jar 以相同性能执行的任何方式?环境是 OSX 10.6.8 和 java 1.6.0_26。排序手册页的底部写着“sort 5.93 November 2004”
它正在执行的命令是:
sort -t' ' -k5,5f -k4,4f -k1,1n /path/to/imput/file -o /path/to/output/file
请注意,当我从终端运行排序时,我需要手动转义制表符分隔符并使用参数 -t$'\t'
而不是实际的制表符(我可以将其传递给 ProcessBuilder ).
看起来像 ps
一切看起来都一样,除了从 IDE 运行时,sort 命令的 TTY 是 ??而不是 ttys000——而是来自 this question我不认为这应该有所作为。也许 BASH 正在减慢我的速度?我的想法已经用完了,我想缩小这个 20 倍的性能差距!
最佳答案
我将冒险进行两种猜测:
也许您正在调用不同版本的排序(执行
which sort
并使用完整的绝对路径重新比较?)也许您正在使用更复杂的区域设置(导致更复杂的字符集处理等)?尝试
export LANG=C sort -t' ' -k5,5f -k4,4f -k1,1n /input/file -o /output/file
比较
关于java - Unix 排序命令需要更长的时间,具体取决于它在何处执行?! (在从 IDE 运行的程序中 ProcessBuilder 最快,从终端运行最慢),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7124489/