Math.max (a, b) или (a> b)? a:b быстрее в Java?

Какой быстрее в Java и почему?

  1. Math.max(a,b)
  2. (a>b)?a:b

(Это спросили в интервью.)

24
задан Trilarion 18 January 2016 в 21:37
поделиться

6 ответов

math.max (a, b) - статическая функция (не означающая виртуальный вызов накладной) и, скорее всего, будет включена JVM к той же инструкциям, что и (A> B)? A: B .

23
ответ дан 28 November 2019 в 22:40
поделиться

Вопросы производительности Всегда вызовите тест, прежде чем вы сможете начать спекулировать:

public static void maxtest()
{
    int res = 0;
    for( int idx = 0; --idx != 0; )
        // res = ( res > idx ) ? res : idx;
        res = Math.max( res, idx );
    System.out.println( "res: " + res );
}

Это работает на моей машине 6 секунд с Math.max () и 3,2 секунды с ?: ? На последнем 1.6.1 X64 Server Sun JVM. Итак ?: на самом деле быстрее. Вопреки всем надеждам, что нам нравится ставить в джиты, которые действительно стали удивительными к тому времени, когда они все еще не поймают все.

Редактировать: Из любопытства Я также попробовал этот код с 32-битным клиентом JVM 1.6.1 на одной и той же машине и с помощью этих версий выполняется за 7 секунд! Таким образом, это, вероятно, не вызов метода, который не станет включенным, но сервер JIT, похоже, может выполнять дополнительные оптимизации для этого конкретного тестового случая, что он не может обнаружить, когда требуется привлеченный к вызову метода.

12
ответ дан 28 November 2019 в 22:40
поделиться

не то же самое. Когда вы пишете (A> B)? A: B У вас нет дополнительного вызова функции, поэтому будет быстрее. Это эквивалент вклада в C ++. Но это не будет иметь никакого значения в реальной жизни. Math.max (a, b) более читается, поэтому я бы использовал его.

-2
ответ дан 28 November 2019 в 22:40
поделиться

С расширенной поддержкой глоббинга можно выполнить следующие действия:

# delete all /opt/local paths in PATH
shopt -s extglob 
printf "%s\n" "${PATH}" | tr ':' '\n' | nl
printf "%s\n" "${PATH//+(\/opt\/local\/)+([^:])?(:)/}" | tr ':' '\n' | nl 

man bash | less -p extglob
-121--734989-

Нет. Но вы можете сделать это, если вы не используете @ property :

.h

@interface X : Y {
  struct X_Impl* impl;
}
-(int)getValue;
@end

.m

struct X_Impl {
  int value;
};
...
@implementation X
-(void)getValue {
  return impl->value * impl->value;
}
@end
-121--4538103-

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

3
ответ дан 28 November 2019 в 22:40
поделиться

Здесь - это код Math.max () в Java:

public static int max(int a, int b) {
    return (a >= b) ? a : b;
}

Итак, код, вероятно, почти) точно такая же скорость.

(Давайте быть честным, если вы беспокоитесь о улучшении скорости на таком низком уровне, вы, вероятно, имеете гораздо большие проблемы в вашем коде.)

22
ответ дан 28 November 2019 в 22:40
поделиться

Оригинальный вопрос не указывает тип аргументов. Это имеет значение, потому что определение максимальных (и мин) для аргументов с плавающей точкой является сложнее. Для плавающей точки (двойной или поплавок) метод Math.max, вероятно, будет медленнее, но он также может вернуть другой результат, если один из аргументов является NAN.

2
ответ дан 28 November 2019 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: