我正在处理一个贸易处理应用程序,在那里我必须处理很多字符串。其中一些字符串是不重复的,例如贸易ID,而另一些字符串则经常重复,比如Product。
在解析trade message (JSON)时,我正在考虑将所有的贸易属性作为一个通用步骤,以减少内存使用并加快等式检查。
我的问题是,这样做是否会无意中降低绩效?
发布于 2017-11-12 13:16:44
删除公共字符串通常是节省内存的一个好主意。
但千万不要使用String.intern来消除重复!
String.intern是一个本机方法;每个调用都有额外的JNI间接费用。常规的HashMap或ConcurrentHashMap可以更好地用于此任务的数量级。
下面的基准测试比较了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/ophttps://stackoverflow.com/questions/47245426
复制相似问题