我做了与本文相同的测试:new String()vs literal String performance
double tx = System.nanoTime();
for (int i = 0; i<1; i++){
String s = "test";
}
double ty = System.nanoTime();
double ta = System.nanoTime();
for (int i = 0; i<1; i++){
String s = new String("test");
}
double tb = System.nanoTime();
System.out.println((ty-tx));
System.out.println((tb-ta));
factor at 1 repetition 3,811565221
factor at 10 repetitions 4,393570401
factor at 100 repetitions 5,234779103
factor at 1,000 repetitions 7,909884116
factor at 10,000 repetitions 9,395538811
factor at 100,000 repetitions 2,355514697
factor at 1,000,000 repetitions 0,734826755
谢谢你!
首先,您必须了解HotSpot的许多内部内容,特别是您的代码首先被解释,然后在一定程度上被编译为本机代码。
很多优化都是在编译过程中发生的,基于对代码的静态和动态分析的结果。
具体地说,在您的代码中,
String s = "test";
String s = new String("test");
对于您的代码,测量结果混合了解释字节码的性能、编译代码和通过堆栈内替换交换代码所需的延迟,以及本机代码的性能。
基本上,您正在进行的测量是测量所有的东西,但您已经开始测量的效果。
为了使参数更可靠,我用jmh
重复了测试:
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 1, time = 1)
@Measurement(iterations = 3, time = 1)
@Threads(1)
@Fork(2)
public class Strings
{
static final int ITERS = 1_000;
@GenerateMicroBenchmark
public void literal() {
for (int i = 0; i < ITERS; i++) { String s = "test"; }
}
@GenerateMicroBenchmark
public void newString() {
for (int i = 0; i < ITERS; i++) { String s = new String("test"); }
}
}
结果如下:
Benchmark Mode Samples Mean Mean error Units
literal avgt 6 0.625 0.023 ns/op
newString avgt 6 43.778 3.283 ns/op
您可以看到,在字符串文本的情况下,整个方法主体都被消除了,而使用new string
时,循环仍然保留,但其中没有任何内容,因为每次循环迭代的时间仅为0.04纳秒。肯定没有分配string
实例。
问题内容: 请告诉我一个实时的情况来比较String,StringBuffer和StringBuilder? 问题答案: 如果使用的是JGraph,则应尝试为算法设计的。它的功能之一是使用库进行可视化。它仍然开发,但相当稳定。我前段时间分析了算法的复杂性。其中一些并不是最快的,但是如果你要自己实现它们并需要显示图形,那么它可能是最佳选择。我真的很喜欢使用它的API,当时我不得不快速编写一个在图形上
我从webflux开始,我想知道以下哪项性能更好,因为它们看起来都很像我 你能帮我弄清楚哪一个最好,为什么?谢谢
我们在Etherpad中非常广泛地使用了SocketIO(从很早开始),我们非常感谢团队为提供如此有用的东西所做的所有努力:) Etherpad是一个nodejs项目。 我对SocketIO的问题可能是由于我的配置错误或理解错误,但经过相当多的测试工具生成,调整内存设置等,我们仍然得到一个令人沮丧的低最大消息数每秒达到10K大关。 Etherpad最新模拟负载测试 在线阅读,看起来切换到ws的性能
问题内容: 我们需要将某些列的数据类型从int更改为bigint。不幸的是,其中一些表很大,大约有7-10百万行(但不宽)。 Alter表alter列将永远保留在这些表上。有没有更快的方法来实现这一目标? 问题答案: 巧合的是,大约3个小时前,我不得不做一些非常相似的事情。该表是3500万行,它相当宽,并且花了很多时间才能做到这一点: 这就是我最终得到的结果: 这次,这些陈述几乎是即时的。(在速度
问题内容: 为了观看对象作用域变量,将其设置为true还是更好? 对于一个对象变量(如15点的属性,一些嵌套2级深)与输入元件和更新在视图中,有多差与设定为?这是要避免的大事吗? 是一个更好的解决方案? 我正在寻找轻松的方式来提高AngularJS应用程序的性能(我仍然停留在v1.2.2上)。 问题答案: 该功能是上述两种配置之间的中间地带。它比普通的$ watch()函数更深入;但是,它几乎不像
为什么当我使用No.2脚本时Android Studio显示错误。我发现1和2之间没有区别。 请解释这个案例