首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中实习所有字符串对性能的影响是什么?

在Java中实习所有字符串对性能的影响是什么?
EN

Stack Overflow用户
提问于 2017-11-12 04:26:33
回答 1查看 390关注 0票数 2

我正在处理一个贸易处理应用程序,在那里我必须处理很多字符串。其中一些字符串是不重复的,例如贸易ID,而另一些字符串则经常重复,比如Product。

在解析trade message (JSON)时,我正在考虑将所有的贸易属性作为一个通用步骤,以减少内存使用并加快等式检查。

我的问题是,这样做是否会无意中降低绩效?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-12 13:16:44

删除公共字符串通常是节省内存的一个好主意。

但千万不要使用String.intern来消除重复!

  • String.intern是一个本机方法;每个调用都有额外的JNI间接费用
  • 它破坏了所有JVM部件之间共享的内部哈希表(例如,类加载)。
  • string表的默认容量不够大,存储桶的数量也是恒定的。
  • 它可能会增加GC暂停,因为JVM扫描这个内部哈希表,并可能在停止世界阶段重新散列它。
  • 关于这份报告的更多细节。

常规的HashMapConcurrentHashMap可以更好地用于此任务的数量级。

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

代码语言:javascript
复制
@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(越小越好)的结果:

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47245426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档