Разница в производительности обмена номерами с временной переменной или без - PullRequest
1 голос
/ 29 марта 2019

В недрах интернета я обнаружил следующее сообщение :

Замена двух чисел без использования новой переменной - это всегда хороший подход. Это помогает вашему приложению ориентироваться на память и производительность.

И он предлагает использовать следующий код:

int firstNum = 10;
int secondNum = 20;

firstNum = firstNum + secondNum;
secondNum = firstNum - secondNum;
firstNum = firstNum - secondNum;

вместо использования временной переменной.

Если честно, для меня это звучит как кучка вздоров. Я знаю, что в реальной среде такие микротвики не будут иметь практически никакого значения, но меня интригует то, что если я не буду использовать новую переменную, в этом случае будет любая разница?

Ответы [ 4 ]

4 голосов
/ 29 марта 2019

Мало того, что это ужасная идея, это даже не хорошая реализация ужасной идеи! Старый трюк пошел:

a^=b;
b^=a;
a^=b;

У этого не будет проблем с переполнением / переполнением, и он действительно очень запутает ваших коллег. Я имею в виду, если вы собираетесь запутать, неэффективный код ... идти до конца!

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

Если вы мне не верите, возможно, вы все еще считаете, что вам следует использовать string Builder каждый раз, когда вы объединяете две строки ...

3 голосов
/ 29 марта 2019

Это куча глупостей; такой совет имел значение только на ранних компьютерах (которые имели серьезные ограничения в реестре). На современных компьютерах это не проблема. Используйте временную переменную (предпочитайте более читаемый код).

1 голос
/ 29 марта 2019
public class SwapTest {

    int firstNum = 10;
    int secondNum = 20;

    public static void main(String args[])
    {
        SwapTest swap2Numbers = new SwapTest();
        long before = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            swap2Numbers.proceedNoInterimVariable();
        }
        System.out.println(" no temp variable took " + (System.currentTimeMillis()-before));

        before = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            swap2Numbers.proceedWithInterimVariable();
        }
        System.out.println("with temp variable took " + (System.currentTimeMillis()-before));
    }

    private void proceedNoInterimVariable()
    {

        firstNum = firstNum + secondNum;
        secondNum = firstNum - secondNum;
        firstNum = firstNum - secondNum;
    }

    private void proceedWithInterimVariable()
    {
        int temp = firstNum;
        firstNum = secondNum;
        secondNum = temp;
    }

}

С этого момента в моей системе временная переменная работает намного быстрее.

 no temp variable took 11
 with temp variable took 4
1 голос
/ 29 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...