【发布时间】:2015-10-25 18:37:58
【问题描述】:
我正在研究一个连续扫描大量相对较短的字符串并从中生成大量子字符串的函数。该函数将用于大容量字符串处理系统。我更喜欢首先优化内存,其次是 CPU,因为我遇到的内存比系统上的 CPU 压力更大。在这种情况下,性能如何比较:
//Java-ish PseudoCode
functionParent(List<String> strings) {
StringBuilder result;
for(String s : strings) {
result.appendAll(functionA(s));
}
}
functionA(String arg1) {
results.add(arg1.substring(i, i + length)); //hotspot here
}
和:
//Java-ish PseudoCode
functionParent(List<String> strings) {
StringBuilder result;
for(String s : strings) {
result.appendAll(functionB(s.toCharArray()));
}
}
functionB(char[] arg1) {
results.add(new String(arg1,i, length)); //hotspot here
}
据我目前的测试所知,内存方面它是一个清洗(char[] 分配可以忽略不计,不会影响 GC,两者都创建相同数量的新字符串/substring() 内存-leak 已在不久前修复),并且 CPU 明智的 char[] 版本获胜,因为不断查找子字符串。这听起来正确吗?我在分析中遗漏了什么吗?
解决方案说明
根据下面的答案,functionB 似乎是最快的。另请注意,functionParent 中有一个 StringBuilder - 并且 StringBuilder 有一个 1append(char[], index, length)` 函数
【问题讨论】:
标签: string performance java-7