Colwin
@Colwin
Ведущий Java-разработчик

Насколько дорог throw?

Известно, что инструкция new Exception() в Java достаточно дорогая из-за сбора stacktrace'а.

Однако иногда в коде, который должен завершиться за фиксированное время, хочется выбросить исключение StopProcessing (extends RuntimeException), которое будет перехвачено на верхнем уровне.

Избежать накладных расходов на stacktrace можно путем предварительного создания Exception'а и сохранения его в static final-переменной, т.к. интересует только факт останова.


Вопрос состоит в следующем: насколько будет дороже (и будет ли дороже) делать throw вместо цепочки return'ов с проверкой флагов останова?
  • Вопрос задан
  • 2903 просмотра
Пригласить эксперта
Ответы на вопрос 3
@senia
Недавно были статьи как раз на эту тему:
Часть раз
Часть два
Ответ написан
taliban
@taliban
php программист
Безусловно ретурны будут быстрей, но стоят ли они той скорости? С исключениями на много приятней и удобней работать.
Ответ написан
Комментировать
Colwin
@Colwin Автор вопроса
Ведущий Java-разработчик
Написал небольшой тестик:


public class Test
{
    public static final RuntimeException fex = new RuntimeException();

    public static void main(String[] args) throws Exception {
        long start;
        long end;

        start = System.currentTimeMillis();

        for (int i = 0; i < 10000; i++) {
            testReturn(0);
        }

        end = System.currentTimeMillis();

        System.out.println("Return time: " + (end - start) + "ms");

        start = System.currentTimeMillis();

        for (int i = 0; i < 10000; i++) {
            try {
                testExceptionThrow(0);
            } catch (RuntimeException e) {
            }
        }

        end = System.currentTimeMillis();

        System.out.println("Exception throw time: " + (end - start) + "ms");

        start = System.currentTimeMillis();

        for (int i = 0; i < 10000; i++) {
            try {
                testExceptionCreate(0);
            } catch (RuntimeException e) {
            }
        }

        end = System.currentTimeMillis();

        System.out.println("Exception create time: " + (end - start) + "ms");
    }

    public static void testReturn(int count) {
        if (count > 1000) {
            return;
        } else {
            testReturn(count + 1);
        }
    }

    public static void testExceptionThrow(int count) {
        if (count > 1000) {
            throw fex;
        } else {
            testExceptionThrow(count + 1);
        }
    }

    public static void testExceptionCreate(int count) {
        if (count > 1000) {
            throw new RuntimeException();
        } else {
            testExceptionCreate(count + 1);
        }
    }
}


В результате имеем следующие цифры:

Return time: 15ms
Exception throw time: 203ms
Exception create time: 1079ms


Тест, конечно, не претендует на большую точность, однако порядок величин показывает.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
19 апр. 2024, в 11:14
65000 руб./за проект
19 апр. 2024, в 11:08
5000 руб./за проект
19 апр. 2024, в 10:59
150000 руб./за проект