java - 在 for 循环中使用它之前将 str.length() 值存储在变量中是否在 Java 中有任何性能改进?

标签 java jvm

简而言之,JVM是否在内部优化了以下代码

public void test(String str)
{
    int a = 0;

    for( int i = 0; i < 10; i++)
    {
        a = a + str.length();
    }
}

像下面的行为一样高效:

public void test(String str)
{
    int len = str.length();
    int a = 0;

    for( int i = 0; i < 10; i++)
    {
        a = a + len;
    }
}

如果它确实进行了优化,它是否通过在内部缓存 str.length() 值来实现?

最佳答案

Elliot F 的回答不错。

我做了一个简单得多的测试,并以非常大量的重复次数运行这两种方法,并分别计时。

第一种方法(长度只计算一次)始终比第二种方法快。

这是我创建的整个测试类;

package _testing;

import java.util.Date;

public class Speed {

    long count = 5000000;
    public static void main(String[] args) {

        long start, finish; 
        Speed sp = new Speed(); 

        start = new Date().getTime();
        sp.test("test");
        finish = new Date().getTime();
        System.out.println("test 1:"+(finish - start));

        start = new Date().getTime();
        sp.test2("test");
        finish = new Date().getTime();
        System.out.println("test 2:"+(finish - start));

    }


    public void test(String str) {
        int len = str.length();
        int a = 0;
        for (int i = 0; i < count; i++) {
            a = a + len;
        }
    }

    public void test2(String str) {
        int a = 0;
        for (int i = 0; i < count; i++) {
            a = a + str.length();
        }
    }   
}

输出看起来像这样;

test 1:7
test 2:22

关于java - 在 for 循环中使用它之前将 str.length() 值存储在变量中是否在 Java 中有任何性能改进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27496870/

相关文章:

java - 在 Java Spring Boot 中从 XML 加载属性的正确方法

scala - scala 与 JVM 的联系有多紧密?

java - 是否有等效于 BCEL(Java .class 操作)但在 C 或 C++ 中

java - 如果直接调用,HttpGet 工作正常,但如果从 Android Activity 调用,则会发出 400 响应

java - 在 Android 中从 URL 中提取 JSON 的特定部分?

java - 什么版本的 SpringRouteBuilder 有 log 和 onException 成员?

java - JVM 实现之间的差异

java - 连接到 HTTPS 站点时发生 SSLHandshakeException

linux - Tomcat什么是Thread Total Started Count

java - "VM Periodic Task Thread"是什么?