gpt4 book ai didi

java - 在 Java 中驻留所有字符串对性能有何影响?

转载 作者:行者123 更新时间:2023-11-30 07:51:21 24 4
gpt4 key购买 nike

我正在开发一个交易处理应用程序,我必须在其中处理大量字符串。其中一些字符串是不重复的,例如贸易 ID,而其他字符串则经常重复,例如产品 ID。

我正在考虑在解析交易消息 (JSON) 时将所有交易属性作为通用步骤进行驻留,以减少内存使用并加快相等性检查。

我的问题是我是否会无意中降低性能?

最佳答案

删除常见字符串的重复项通常是节省内存的好主意。
但切勿使用 String.intern 进行重复数据删除!

  • String.intern 是本地方法;每次通话都会受到额外的 JNI overhead 的影响.
  • 它破坏了在所有 JVM 部分(例如类加载)之间共享的内部哈希表。
  • 默认的字符串表容量不够大,桶数是固定的。
  • 这可能会增加 GC 暂停,因为 JVM 会扫描此内部哈希表并可能在停止世界阶段对其进行重新哈希处理。
  • 更多详情请参阅 this presentation .

常规的 HashMapConcurrentHashMap 对于此任务来说要好上一个数量级。

以下基准比较了 String.intern[Concurrent]HashMap.putIfAbsent 在 1M 字符串集上的性能:

@State(Scope.Benchmark)
public class Dedup {
private static final HashMap<String, String> HM = new HashMap<>();
private static final ConcurrentHashMap<String, String> CHM = new ConcurrentHashMap<>();

private static final int SIZE = 1024 * 1024;
private static final String[] STRINGS = new Random(0).ints(SIZE)
.mapToObj(Integer::toString)
.toArray(String[]::new);

int idx;

@Benchmark
public String intern() {
String s = nextString();
return s.intern();
}

@Benchmark
public String hashMap() {
String s = nextString();
String prev = HM.putIfAbsent(s, s);
return prev != null ? prev : s;
}

@Benchmark
public String concurrentHashMap() {
String s = nextString();
String prev = CHM.putIfAbsent(s, s);
return prev != null ? prev : s;
}

private String nextString() {
return STRINGS[++idx & (SIZE - 1)];
}
}

JDK 9 上的结果(越小越好):

Benchmark                Mode  Cnt    Score    Error  Units
Dedup.concurrentHashMap avgt 10 91,208 ± 0,569 ns/op
Dedup.hashMap avgt 10 73,917 ± 0,602 ns/op
Dedup.intern avgt 10 832,700 ± 73,402 ns/op

关于java - 在 Java 中驻留所有字符串对性能有何影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47245426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com