Каков самый быстрый способ перевернуть логическое значение Java?

Какой способ быстрее и менее ресурсоемок:

boolean = !boolean
boolean ^= boolean

Изменить: это не вопрос, основанный на мнении. Есть правильный ответ.


person by this guy.    schedule 18.01.2016    source источник
comment
Это бессмысленная нанооптимизация. Напишите тот, который наиболее удобен для чтения и понятен нормальным людям.   -  person duffymo    schedule 18.01.2016
comment
Это НЕ законный вопрос. И это даже дубликат stackoverflow.com/questions/224311/   -  person Idos    schedule 18.01.2016
comment
Вряд ли имеет значение в любой ситуации.   -  person kbz    schedule 18.01.2016
comment
Я не вижу практического применения этих знаний (если они у вас есть, опубликуйте их), но из общего любопытства это кажется нормальным вопросом. Понятно, есть пример кода и ответ - не вопрос мнений. Я также не понимаю, почему у него так много голосов против   -  person jonk    schedule 18.01.2016
comment
@Idos это не дубликат. Ваша ссылка не дает ответа на вопрос, какой из двух операторов в этом вопросе требует меньшей производительности.   -  person RaminS    schedule 18.01.2016


Ответы (2)


Я измерил с помощью следующего кода.

public static void main(String[] args)
{

    boolean myVariable = true;
    long startTime = 0;
    long endTime = 0;
    long duration1 = 0;
    long duration2 = 0;


    for(int i=0; i<1000; i++) {
        startTime = System.nanoTime();
        myVariable = !myVariable;
        endTime = System.nanoTime();

        duration1 += (endTime - startTime);


        startTime = System.nanoTime();
        myVariable ^= myVariable;
        endTime = System.nanoTime();

        duration2 += (endTime - startTime);

    }

        System.out.println("The duration for the first operation is :" + (duration1/1000));
        System.out.println("The duration for second operation is :" + (duration2/1000));
}

и результаты (в наносекундах)

Продолжительность первой операции: 140

Продолжительность второй операции: 123

Основываясь на этом анализе, логическое ^ = логическое значение быстрее, чем логическое =! Логическое.

person Bernhard Colby    schedule 18.01.2016
comment
Думаю, если вы сначала сделаете boolean ^= boolean, то boolean = !boolean будет быстрее. - person Jakuje; 18.01.2016
comment
@Jakuje boolean ^ = boolean уже быстрее. Я поменял их местами, и логическое ^ = логическое все еще быстрее. - person Bernhard Colby; 18.01.2016
comment
Ok. Это была попытка пошутить над java. Но да, в этом есть смысл. - person Jakuje; 18.01.2016
comment
@Jakuje :) Когда я поменял их местами, логическое ^ = логическое завершилось за 78 наносекунд, а остальные 115 наносекунд. Конечно, это зависит от мощности локальной машины, но почему-то мы должны доверять статистике :) - person Bernhard Colby; 18.01.2016
comment
Отличный тест! Спасибо за код. Я только недавно узнал о булевом обмене Xor, и мне было любопытно, что было бы лучше ... даже если это будет в наносекундах. - person by this guy.; 19.01.2016

boolean = !boolean, вероятно, лучше, так как его легче читать. Оба они не совсем ресурсоемкие, поэтому использование любого из них не повлияет на производительность.

person J J    schedule 18.01.2016