Java - 内联代码会有什么好处吗?

时间:2015-12-24 00:07:05

标签: java android performance memory-management inline

我做了一些研究,但我主要看到c ++的答案。我最接近的是this。我也看到this page,但它并没有真正解释任何事情。

如果我使用第二段代码有什么好处吗?会有明显的性能差异吗?记忆呢?如果重复完成该怎么办?

现在我有这个功能。我确信这样做的好处是代码可读性:

private static Bitmap resize(Bitmap image, int maxWidth) {
    float widthReducePercentage = ((float) maxWidth / image.getWidth());
    int scaledHeight = Math.round(image.getHeight() * widthReducePercentage);

    return Bitmap.createScaledBitmap(image, maxWidth, scaledHeight, true);
}

现在,我有第二段代码:

private static Bitmap resize(Bitmap image, int maxWidth) {
    return Bitmap.createScaledBitmap(image, maxWidth, Math.round(image.getHeight() * (float) maxWidth / image.getWidth()), true);
}

一个更简单的例子是:

for(;;) {
    String foo = "hello";
    Console.print(foo + "world");
}

for(;;) {
    Console.print("hello" + "world");
}

4 个答案:

答案 0 :(得分:9)

首先:这不是“内联”的意思。请参阅:What is inlining?

第二:不,表现不会有任何可衡量的差异。在两个代码示例中,两个版本的编译代码可能都是相同的。

答案 1 :(得分:4)

我定义了两个简单的类Test1Test2并编译它们。

public class Test1{
    public String f(){
        String s = "Hello";
        String t = "There";
        return s + t;
    }
}

public class Test2{
    public String f(){
        return "Hello" + "There";
    }   
}

令我惊讶的是,.class文件的大小不一样。

-rw-r--r--  1 csckzp  staff  426 Dec 23 19:43 Test1.class
-rw-r--r--  1 csckzp  staff  268 Dec 23 19:43 Test2.class

也许我不应该感到惊讶,因为一些符号信息与代码一起存储。我通过在线反编译器运行.class文件。 Test1的重建方式与其输入的方式非常相似。另一方面,Test2以这种方式反编译:

public class Test2 {
    public String f() {
        return "HelloThere";
    }
}

编译器的优化清楚地显示在这里。对于非紧凑代码,Java可能会有一个小的惩罚。

答案 2 :(得分:3)

他们都是一样的。前者只是比后者更清楚。

下面有一些情况可以使单行有用。

public boolean isEmpty() {
   return getCount() != 0;
}

如果你想让它更容易阅读,特别是在方程式时,请选择variable。单行使其简单而简短,但适用于短而简单的逻辑。

这是我个人的意见。

答案 3 :(得分:1)

虽然局部变量在转换为字节码时仍然存在,但它们不太可能在编译时幸存。此外,即使存在局部变量,它们也不会显着影响该方法的性能,因为重新缩放位图比存储或检索局部变量要贵几个数量级。

关于字符串连接的第二个示例突出显示了此规则的一个小异常,因为局部变量的存在可能会禁止编译时评估常量字符串的连接。但是,这不太可能对程序的运行时间产生重大影响,因为您可能不会经常连接常量字符串。

一般来说,内联变量对运行时性能的影响很少可以测量,更不用说了。因此,通过使代码易于阅读和推理,您可以更好地花时间优化程序员性能。