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


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

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

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