|
|
|
Чем assert'ы лучше условной компиляции ?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. в некоторых ужасно-отстойных языках существуют директивы типа #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. Если запустить 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'ами ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2013, 15:29:13 |
|
||
|
Чем assert'ы лучше условной компиляции ?
|
|||
|---|---|---|---|
|
#18+
Как вариант, JIT выкинет assert'ы из кода. Вообще, их лучше не использовать. Нафиг они никому не нужны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2013, 15:41:39 |
|
||
|
Чем assert'ы лучше условной компиляции ?
|
|||
|---|---|---|---|
|
#18+
LeonidvКак вариант, JIT выкинет assert'ы из кода. Вообще, их лучше не использовать. Нафиг они никому не нужны.но условная компиляция или её аналог - точно нужны. Любое сложное приложение неизбежно будет снабжаться отладочным кодом, который нельзя ни оставлять в продуктиве, ни выкидывать. Как выкручиваются из этого правильные java-пацаны ? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2013, 23:55:43 |
|
||
|
Чем assert'ы лучше условной компиляции ?
|
|||
|---|---|---|---|
|
#18+
ozzmosisЛюбое сложное приложение неизбежно будет снабжаться отладочным кодом http://stackoverflow.com/a/1344287 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2013, 00:05:32 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=59&tid=2129330]: |
0ms |
get settings: |
21ms |
get forum list: |
32ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
70ms |
get topic data: |
23ms |
get forum data: |
6ms |
get page messages: |
85ms |
get tp. blocked users: |
3ms |
| others: | 336ms |
| total: | 592ms |

| 0 / 0 |
