Java - Будет ли встраиваемый код иметь преимущества?

Я немного поработал, но в основном вижу ответы на С++. Ближайшим, к которому я пришел, является this. Я также видел эту страницу, но на самом деле ничего не объясняет.

Есть ли какие-либо преимущества, если я использую второй кусок кода? Будут ли заметные различия в производительности? Как насчет памяти? Что делать, если это повторяется?

Сейчас у меня есть эта функция. Я уверен, что это полезно для чтения кода:

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

Ответ 1

Во-первых: это не то, что означает "inlining". Смотрите: Что такое inlining?

Второе: нет, не будет никакой измеримой разницы в производительности. В обоих примерах кода, вероятно, скомпилированный код будет идентичным для обеих версий.

Ответ 2

Я определил два простых класса Test1 и Test2 и скомпилировал их.

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 существует небольшой штраф за некомпактный код.

Ответ 3

Они оба одинаковы. первый только делает вещи яснее, чем последние.

Существуют ситуации, такие как блок ниже, который делает однострочные значения полезными.

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

Если вы хотите упростить чтение, особенно когда дело доходит до уравнений, перейдите к variable. однострочники делают его простым и коротким, но хороши для коротких и простых логик.

Это мое личное мнение.

Ответ 4

В то время как локальные переменные переносят перевод на байт-код, они вряд ли выживут только во время компиляции. Более того, даже если локальные переменные присутствуют, они не будут существенно влиять на производительность этого метода, так как масштабирование растрового изображения на порядок дороже, чем хранение или получение локальной переменной.

Ваш второй пример о конкатенации строк подчеркивает небольшое исключение из этого правила, поскольку наличие локальных переменных может препятствовать оценке времени компиляции константных строк. Опять же, это очень маловероятно, чтобы существенно повлиять на время выполнения вашей программы, потому что вы, вероятно, не очень часто конкатенируете постоянные строки.

Вообще говоря, влияние вложения локальных переменных на производительность во время выполнения очень редко измеримо, не говоря уже о значительном. Таким образом, ваше время намного лучше потрачено на оптимизацию производительности программиста, благодаря чему ваш код легко читать и рассуждать.