gpt4 book ai didi

java - 为什么字符串需要不同的时间来创建?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:12:51 27 4
gpt4 key购买 nike

谁能给我解释一下这是怎么回事...

场景一

这个:

// around 50ms
for (int i = 0; i < 3000000; i++) {
String str = new String();
}

...比这更耗时:

// around 25ms
for (int i = 0; i < 3000000; i++) {
String str = new String("");
}

场景二

这个:

String str = new String(); // around 3000ns

比这耗时:

String str = new String(""); // around 5000ns

为什么在场景 1 中调用空 String() 构造函数更耗时,而在场景 2 中却没有?我查看了 String() 和 String(String original) 的文档,但我看不到那里有任何优化。这种优化(如果确实是优化)是在其他地方完成的吗?

更新:

我是如何安排时间的:

long start = System.nanoTime();
//doing stuff here
long elapsedTime = System.nanoTime() - start;

我的系统:

Windows 7 x64,使用 Java 7 和 Eclipse

最佳答案

在不知道基准测试结果的情况下很难说,但我会把钱花在 System.nanoTime 上,它没有足够高的分辨率到 measure a single object instantiation。 .我敢打赌 String()String("") 都需要不到 nanoTime 时钟的一次滴答来实例化,并且你的结果是你试图测量比它的分辨率更小的东西这一事实的产物。

This (三岁)问题指向 ~20 ns 的实例化,我链接的上一个问题表明 nanoTime 的分辨率实际上是 ~10ns。我的猜测是,两者的实例化时间实际上都在 10 ns 和 20 ns 之间,看似不同的只是噪声。

编辑回应评论:

出了点问题。单个对象实例化不可能花费 3000 ns。我猜您正在测量 JVM 预热时间或类似时间,并且 "" 的存在可能导致 JVM 命中某些代码路径,如果没有 ""。我不确定是什么导致了您的问题,但我不认为您要测量的是对象实例化时间。

关于java - 为什么字符串需要不同的时间来创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25048479/

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