LINUX.ORG.RU

[нубский вопрос] оптимальность кода

 


0

0

Подскажите, как оптимальнее, с точки зрения компилятора (в т.ч. для байткода JVM), писать:

        if (currency.equals("RUR")) {
            if (price.getValue().longValue() == 0) {
                return price.getValue();
            }
            
            if (price.getCurrency() == BasicCurrency.USD) {
                return price.getValue().multiply(usdRubExchangeRate);
            }
            
            return price.getValue();
        }
        if (currency.equals("RUR")) {
            if (price.getValue().longValue() == 0) {
                return price.getValue();
            } else if (price.getCurrency() == BasicCurrency.USD) {
                return price.getValue().multiply(usdRubExchangeRate);
            } else {
                return price.getValue();
            }
        }
★★★★★

> Подскажите, как оптимальнее, с точки зрения компилятора (в т.ч. для байткода JVM), писать:

Premature optimization is the root of all evil.~--- (c) Donald Knuth.

PS:
говножаба не нужна

CL-USER
()

Посмотри листинг скомпиленного класса. Мне кажется, что компилятор должен соптимизировать первый вариант, так что байткоды в обоих случаях будут одинаковы.

static_lab ★★★★★
()

> price.getValue().longValue()

> price.getValue().multiply(usdRubExchangeRate);

блин, это же песец какой-то, товарищи, как вы пишете на таком страшноя языке

anonymous
()

а вообще плюсую, не в этом месте надо оптимизировать

anonymous
()

Строго говоря и по логике это два разных кода. )
Для компиляторов существует порог оптимизации для конструкций else if
- свыше некоторого числа их (на памяти для BSO было как более 11) выполняются попытки построения логики ветвления через табличные переходы.
Оптмизацию байткода я не ковырял.

elipse ★★★
()

В данном конкретном случае разницы никакой.

smh ★★★
()
        if (currency.equals("RUR")) {
           
            if (price.getCurrency() == BasicCurrency.USD) {
                return price.getValue().multiply(usdRubExchangeRate);
            }
           
            return price.getValue();
        }

жеж . не? оптимизация для читабельности

anTaRes ★★★★
()

А зачем price.getValue() вычисляешь помногу раз? По-моему было бы достаточно одного.

dave ★★★★★
()
Ответ на: комментарий от CL-USER

> Premature optimization is the root of all evil.~--- (c) Donald Knuth.

Если повторяешь слова за умными дядями, то нужно знать и другой принцип. Он называется "избежание преждевременной пессимизации". :)

dave ★★★★★
()

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

Упрёка в разной функциональности не понял, куски кода абсолютно одинаково работают для _данного_ конкретного случая.

Это не желание что-то оптимизировать, а скорее желание определиться, как писать оптимальнее.

Кому-то не понравился код price.getValue().multiply(usdRubExchangeRate) - каким образом в Вашем языке выполняется работа с большими числами ? Это - BigDecimal.

Ну и на счёт общей корявости кода — буду рад примеру исправления, благо код не большой.

P.S. - price.getValue() ничего не вычисляет, это просто геттер.

roy ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Зачем, когда здесь полно гуру? :)

roy ★★★★★
() автор топика
        if (currency.equals("RUR")) 
        {          
            if (price.getCurrency() == BasicCurrency.USD) 
            {
                return price.getValue().multiply(usdRubExchangeRate);
            }
            
            return price.getValue();
        }

Ы?

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

Никак не привыкну к лоркоду :-(

Да, вобщем, товарищ anTaRes уже успел соптимизировать так же :-)

Anoxemian ★★★★★
()

И правда, упустил как-то. Спасибо. Для себя же решил, что лучше лишний if/else не городить.

roy ★★★★★
() автор топика

price * usdRubExchangeRate, очевидно же

нафига вообще по сто раз getValue непонятно, хоть во временную переменную запомнить, хоть не так по-уродски будет выглядеть

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.