Java-内联代码会有好处吗? 我做了一些研究,但我主要看到C++答案。最接近我的是。我也看到了,但这并不能解释什么

Java-内联代码会有好处吗? 我做了一些研究,但我主要看到C++答案。最接近我的是。我也看到了,但这并不能解释什么,java,android,performance,memory-management,inline,Java,Android,Performance,Memory Management,Inline,如果我使用第二段代码,有什么好处吗?是否存在明显的性能差异?记忆呢?如果重复做会怎么样 现在我有这个函数。我相信这样做的好处是代码可读性: private static Bitmap resize(Bitmap image, int maxWidth) { float widthReducePercentage = ((float) maxWidth / image.getWidth()); int scaledHeight = Math.round(image.getHeigh

如果我使用第二段代码,有什么好处吗?是否存在明显的性能差异?记忆呢?如果重复做会怎么样

现在我有这个函数。我相信这样做的好处是代码可读性:

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");
}

他们都一样。前者只是让事情比后者更清楚

有些情况下,例如下面的块,使一行程序变得有用

public boolean isEmpty() {
   return getCount() != 0;
}
如果你想让它更容易阅读,特别是当它涉及到方程时,可以选择一个
变量
。一行程序使它变得简单和简短,但适合于简短和简单的逻辑

这是我个人的观点。

首先:这不是“内联”的意思。见:


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

我定义了两个简单类
Test1
Test2
,并编译了它们

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

令我惊讶的是,.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文件<代码>测试1几乎按照输入的方式重新构建<另一方面,代码>测试2,反编译方式如下:

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

这里清楚地显示了编译器的优化。在Java中,非紧凑代码可能会有一个小小的缺陷。

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

关于字符串连接的第二个示例突出显示了此规则的一个小例外,因为局部变量的存在可能会抑制常量字符串连接的编译时计算。然而,这也不太可能对程序的运行时间产生重大影响,因为您可能不经常连接常量字符串


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

我相信不管怎样,编译器都会进行优化,因此您的测试对示例可能会执行类似的操作。在任何情况下,内联都可以使代码更容易阅读。对于您给出的示例,在性能上没有任何区别。甚至不必为这些“优化”费心,只要做读起来最好的事情。@LouisWasserman Roger第二个优化示例:
Console.print(“hello world”)这节省了字符串连接(在每次迭代中),这是非常昂贵的。Java字节码将不同,因为没有消除局部变量(它们可用于调试)。JIT和Dalvik编译器可能会删除它们。在我发布了这个答案后,我做了一个简单的实验,类似于LIProf。而编译的文件确实不同。除了我使用了
-g:none
标志,所以不应该有任何调试符号。所以我想这比我想象的要复杂一点;字节码编译器进行非常小的优化。它们的等价性将在运行时得到验证。编译器试图消除结果可以在编译时确定的操作。这就是为什么“Hello”+“There”变成“HelloThere”的原因。
public class Test2 {
    public String f() {
        return "HelloThere";
    }
}