string - String.substring() 的性能与手动查找复制的 char[] 数组相比如何?

标签 string performance java-7

我正在查看一个函数,它连续扫描大量相对较短的字符串,并从中生成大量子字符串。该函数将用于大容量字符串处理系统。我更喜欢先优化内存,其次是 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/

相关文章:

string - 优化 F# 字符串连接

带有 "..."数组的 Java 主要方法?

css - 在 HTML5 视频元素上使用 "will-change"有好处吗?

r - 在 R/Rcpp 中过滤 data.frame 列表列内容的最快方法

java - 如何检查我的应用程序是否可以创建符号链接(symbolic link)?

java - Swing 菜单 Java 7 mac osx

python - 相当于 Go 中的 Python string.format?

php - 根据 4 个不同的分隔符将字符串分解为多维数组,这些分隔符表示级别如何分隔

计算 Sandy Bridge 上的整数运算

java - Java 外来标识符的状态