производительность проверки на конечность - PullRequest
0 голосов
/ 21 апреля 2011

Что быстрее:

private static boolean isFinite(float x) {
    return !(x != x || x == Float.POSITIVE_INFINITY || x == Float.NEGATIVE_INFINITY);
}

или

private static boolean isFinite(float x) {
    return Float.NEGATIVE_INFINITY < x && x < Float.POSITIVE_INFINITY;
}

?

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

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

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

Я бы остановился на том, что вы считаете самым ясным и простым, и JVM, вероятно, оптимизирует это лучше всего.

РЕДАКТИРОВАТЬ: проблема с микро-бенчмаркингом заключается в том, что то, как вы тестируете, может повлиять на результаты.имеет большое значение.

Гораздо важнее, чем задействованные операции, является оптимизация числа ветвей и то, насколько хорошо будет работать предсказание ветвей.http://www.agner.org/optimize/microarchitecture.pdf

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

        floats[i] = d < 0.25 ? Float.NaN :
                d < 0.5 ? Float.NEGATIVE_INFINITY :
                d < 0.75 ? Float.POSITIVE_INFINITY : (float) d;

Все, что это делает, это увеличивает вероятность прохождения кода по другому пути.

1,2: isFinite1 took 8.5 ns and isFinite2 took 14.2 ns on average
2,1: isFinite1 took 10.9 ns and isFinite2 took 11.5 ns on average
1,2: isFinite1 took 7.2 ns and isFinite2 took 14.4 ns on average
2,1: isFinite1 took 11.0 ns and isFinite2 took 11.5 ns on average
1,2: isFinite1 took 7.3 ns and isFinite2 took 14.2 ns on average
2,1: isFinite1 took 10.8 ns and isFinite2 took 11.5 ns on average

Повторяю, более ясный код должен быть вашей целью!;)

0 голосов
/ 21 апреля 2011

Вы уверены, что это будет быстрее, чем делать это каноническим способом?

Float.isInfinite(f) ? false : Float.isNaN(f) ? false : true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...