【发布时间】:2009-08-27 09:16:04
【问题描述】:
我遇到了与字符串比较相关的性能问题(在 Java 中)。
我正在处理一个需要对大量列表进行排序的项目(Eclipse 中的 TableViewer)。无论如何,我已经将瓶颈定位到调用 compareTo() 来比较字符串。
有没有办法优化字符串比较的性能?我已经搜索和谷歌搜索无济于事......
由于该项目严格限于 Win32 环境,我想也许可以利用它...
任何建议将不胜感激。
编辑:我忘了说我需要对字符串进行数值比较和文字比较。
EDIT2: 目标本质上是加快用户界面的速度,因为每次单击表格标题执行排序时都等待几秒钟是不可接受的。我正在研究可能以某种方式缓存值以加快比较速度。由于字符串几乎是静态的,我认为这是可能的。
EDIT3: 我知道你们中的很多人都被 try()-catch() 的事情所困扰。实际上,这并不是什么大问题,因为即使我删除了该代码并仅执行 catch 块(单个 compareTo()),它仍然以与原始代码几乎相同的速度执行。但是,如果我也注释掉 compareTo() ;只剩下比较功能的开销(获取标签等),它快如闪电。所以我仍然需要一种更好的方法来比较字符串。通过缓存或做一些其他的魔法。
不幸的是,无法更改排序算法 - 但是我怀疑它是否会这么慢,因为它成功地对纯整数进行了非常快的排序。
澄清:
比较函数是作为 TableViewer 框架的一部分实现的,用于执行排序操作,这意味着我没有实现特定的排序算法,而是由 SWT/JFace 实现。我只是实现了比较功能。
更有趣的是,排序双精度的代码比字符串比较快。仅使用数字对列进行排序比使用实际文字字符串排序更快……这使我得出结论,在 compareTo() 方法中发生了一些可疑的事情……
这里是函数的核心:
// e1Label and e2Label is Strings to be compared
//
// Be smart about the comparison and use non-lexical comparison if
// possible (i.e. if both strings are actually numbers...)
//
// Warning: This is only "semi-smart" as the sorting might get "a bit"
// messed up if some of the values in a column can be parsed as
// doubles while others can not...
//
try {
// Try using numeric (double) comparison of label values
//
double e1_double = Double.parseDouble(e1Label);
double e2_double = Double.parseDouble(e2Label);
rc = Double.compare(e1_double, e2_double);
} catch (NumberFormatException e) {
// Use lexical comparison if double comparison is not possible
//
rc = e1Label.compareToIgnoreCase(e2Label);
}
【问题讨论】:
-
在这里给出一些上下文,列表中有多少项?
-
哦,对不起。实际项目实际上并没有那么多。它可能在 3000-8000 项之间。
标签: java performance eclipse optimization