powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Чем assert'ы лучше условной компиляции ?
5 сообщений из 5, страница 1 из 1
Чем assert'ы лучше условной компиляции ?
    #38263846
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

в некоторых ужасно-отстойных языках существуют директивы типа #ifdef / #endif, позволяющие не компилировать отладочный код, добавленный при разработке. Этот код вообще не будет включен в .exe и, след-но, "нагрузка" на продакшен от него будет нулевой.
Дока утверждает, что при выключенных assert'ах влияние их на производительность также нулевое:авторTo ensure that assertions are not a performance liability in deployed applications, assertions can be enabled or disabled when the program is started, and are disabled by default. Disabling assertions eliminates their performance penalty entirely .
Как такое может быть, если проверки, связанные с assert'ами, всё равно остаются внутри байт-кода ?
Вот пример:
Код: java
1.
2.
3.
4.
5.
6.
class AssertionTest {
  public static void main(String[] args) {
    //assert(args.length==1) : "invalid agrs.lenght";
    System.out.println("foo, args.length="+args.length);
  }
}

Если запустить javap -c -AssertionTest для двух вариантов этого кода: с закомментированным и раскомментированным assert'ом, - то получаем следующее (строки с одинаковыми байт-командами находятся на одной позиции "по высоте"):
Байт-код БЕЗ assert'aБайт-код _C_ assert'ом.static final boolean $assertionsDisabled;..AssertionTest();AssertionTest(); Code: Code: 0: aload_0 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return 4: return..public static void main(java.lang.String[]);public static void main(java.lang.String[]); Code: Code:. 0: getstatic #2; //Field $assertionsDisabled:Z. 3: ifne 22. 6: aload_0. 7: arraylength. 8: iconst_1. 9: if_icmpeq 22. 12: new #3; //class java/lang/AssertionError. 15: dup. 16: ldc #4; //String invalid agrs.lenght. 18: invokespecial #5; //Method java/lang/AssertionError."<init>":(Ljava/lang/Object;)V. 21: athrow 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 22: getstatic #6; //Field java/lang/System.out:Ljava/io/PrintStream; 3: new #3; //class java/lang/StringBuilder 25: new #7; //class java/lang/StringBuilder 6: dup 28: dup 7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V 29: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V 10: ldc #5; //String foo, args.length= 32: ldc #9; //String foo, args.length= 12: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 34: invokevirtual #10; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 15: aload_0 37: aload_0 16: arraylength 38: arraylength 17: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 39: invokevirtual #11; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 20: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 42: invokevirtual #12; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 23: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 45: invokevirtual #13; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 26: return 48: return}.static {};. Code:. 0: ldc_w #14; //class AssertionTest. 3: invokevirtual #15; //Method java/lang/Class.desiredAssertionStatus:()Z. 6: ifne 13. 9: iconst_1. 10: goto 14. 13: iconst_0. 14: putstatic #2; //Field $assertionsDisabled:Z. 17: return.}

Если я запущу java AssertionTest без ключика '-ea', то разве ява не будет тратить время на исполнение / проверки чего-то там, связанного с assert'ами ?
...
Рейтинг: 0 / 0
Чем assert'ы лучше условной компиляции ?
    #38263851
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант, JIT выкинет assert'ы из кода.
Вообще, их лучше не использовать. Нафиг они никому не нужны.
...
Рейтинг: 0 / 0
Чем assert'ы лучше условной компиляции ?
    #38263870
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeonidvКак вариант, JIT выкинет assert'ы из кода.
Вообще, их лучше не использовать. Нафиг они никому не нужны.но условная компиляция или её аналог - точно нужны.
Любое сложное приложение неизбежно будет снабжаться отладочным кодом, который нельзя ни оставлять в продуктиве, ни выкидывать.
Как выкручиваются из этого правильные java-пацаны ? :-)
...
Рейтинг: 0 / 0
Чем assert'ы лучше условной компиляции ?
    #38263874
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisЛюбое сложное приложение неизбежно будет снабжаться отладочным кодом http://stackoverflow.com/a/1344287
...
Рейтинг: 0 / 0
Чем assert'ы лучше условной компиляции ?
    #38264030
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

спс.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Чем assert'ы лучше условной компиляции ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]