我正在查看一个函数,它连续扫描大量相对较短的字符串,并从中生成大量子字符串。该函数将用于大容量字符串处理系统。我更喜欢先优化内存,其次是 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() 内存泄漏是不久前修复),并且 CPU 明智的 char[] 版本获胜,因为对子字符串的不断查找。这听起来正确吗?我在分析中遗漏了什么吗?
解决方法注意事项
functionB
根据下面的答案,似乎是最快的。还要注意 functionParent 中有一个 StringBuilder - 而 StringBuilder 有一个 1append(char[], index, length)` 函数
最佳答案
String.substring
- 除了边界检查,通过调用 new String(value, beginIndex, subLen)
完成- 除非结果是整个原始字符串,在这种情况下它只返回原始字符串。
所以我会用你的第二个/“functionB
” 例子。
关于string - String.substring() 的性能与手动查找复制的 char[] 数组相比如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33333486/