예외가 발생하지 않더라도 트라이캐치 블록을 사용하는 것은 비용이 많이 드나요?
우리는 예외를 잡는 것이 비싸다는 것을 알고 있다.단, 예외가 발생하지 않더라도 Java에서 트라이캐치 블록을 사용하는 것도 비용이 많이 들까요?
Stack Overflow 질문/답변 "Try blocks는 왜 비싼가요?"를 확인했는데, 용입니다.네트워크
try
거의 비용이 들지 않습니다.the업 up 을 하지 않고try
때을 걸어 이 많이 드는 되게 됩니다.또, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」의 어느쪽인가를 합니다.try
이 예외를 포착할 수 있는 블록이 존재합니다.try
실제로 드는 , , 개의 않는 한 비용을 이다.실제로 비용이 드는 예외를 두는 것입니다.그러나 수백, 수천 개의 예외를 두지 않는 한, 그 비용을 알 수 없습니다.
try
에는 몇 가지 경미한 비용이 포함되어 있습니다. 최적화를 수행할 수 없습니다.try
수 있도록 하는 경우가 많습니다을 확인할 .예를 들어, Java는 종종 명령어를 빠르게 실행하도록 다시 배열하지만, Java는 예외가 발생했을 때 소스 코드에 기술된 대로 메서드의 실행이 행까지 순서대로 수행되는 것처럼 관찰되도록 보장해야 합니다.
★★★★★★★★★★★★★★★★★.try
블록 예외가 발생할 수 있습니다(트라이 블록의 모든 라인에서).. , 을 합니다.stop
스레드 상에서(추천되지 않음), 그리고 Out Of Memory Error는 거의 어디에서나 발생할 수 있지만, 그래도 검출되어 같은 방법으로 코드가 그 후에 계속 실행될 수 있습니다.은 큰 이런 것입니다.예외적'이라고 생각되는 것은 큰 고통입니다.하지만 실제로 이런 것은 알아차리지 못할 것입니다.
재어볼까요?
public abstract class Benchmark {
final String name;
public Benchmark(String name) {
this.name = name;
}
abstract int run(int iterations) throws Throwable;
private BigDecimal time() {
try {
int nextI = 1;
int i;
long duration;
do {
i = nextI;
long start = System.nanoTime();
run(i);
duration = System.nanoTime() - start;
nextI = (i << 1) | 1;
} while (duration < 100000000 && nextI > 0);
return new BigDecimal((duration) * 1000 / i).movePointLeft(3);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
@Override
public String toString() {
return name + "\t" + time() + " ns";
}
public static void main(String[] args) throws Exception {
Benchmark[] benchmarks = {
new Benchmark("try") {
@Override int run(int iterations) throws Throwable {
int x = 0;
for (int i = 0; i < iterations; i++) {
try {
x += i;
} catch (Exception e) {
e.printStackTrace();
}
}
return x;
}
}, new Benchmark("no try") {
@Override int run(int iterations) throws Throwable {
int x = 0;
for (int i = 0; i < iterations; i++) {
x += i;
}
return x;
}
}
};
for (Benchmark bm : benchmarks) {
System.out.println(bm);
}
}
}
내 컴퓨터에서는 다음과 같이 인쇄됩니다.
try 0.598 ns
no try 0.601 ns
적어도 이 간단한 예에서는 try 스테이트먼트가 퍼포먼스에 측정 가능한 영향은 없었습니다.좀 더 복잡한 것을 자유롭게 측정하세요.
일반적으로 코드에 실제 성능 문제가 있다는 증거가 있을 때까지 언어 구성물에 대한 성능 비용에 대해 걱정하지 않는 것이 좋습니다.Donald Knuth가 말했듯이 "최신 최적화는 모든 악의 근원"입니다.
try
/catch
퍼포먼스에 영향을 줄 수 있습니다.이는 JVM이 일부 최적화를 수행할 수 없도록 하기 때문입니다." Java조슈아: "Effective Java" 조슈아 블로흐는 말했다.
• 코드를 트라이캐치 블록 내에 배치하면 최신 JVM 구현이 수행할 수 있는 특정 최적화를 방지할 수 있습니다.
처럼 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 네.try
은 블록 합니다.{}
할 수 은 없습니다.특히 옵티마이저는 블록 내의 어느 지점에서나 예외가 발생할 수 있다고 가정해야 하므로 문이 실행된다는 보장은 없습니다.
예를 들어 다음과 같습니다.
try {
int x = a + b * c * d;
other stuff;
}
catch (something) {
....
}
int y = a + b * c * d;
use y somehow;
★try
x
는"공통 부분식"로서브 표현식」으로 보존해,재이용할 수 있습니다 「공통에 할당할 다시 저장될 수 있다.y
. 하지만 하지만 그 이유는 때문에try
그래서 표현 recomputed야 한다 없는 보증은 첫번째 표현되고 있다.첫 번째 표현이 평가되었다는 보장이 없기 때문에 그 표현은 다시 계산되어야 합니다."직선"코드에서 이것은 보통 큰 일이지만, 루프에 상당할 수 있다.이것은 보통"직선"코드에서는 중요하지 않지만 루프에서는 중요할 수 있습니다.
그러나 그것은 이JITCed 코드 전용 규약 군에 적용된다. 최적화 javac는다만piddling 양 그리고 이는 JITCed 코드에만 적용된다는 점에 유의해야 합니다.javac은 최적화의 피들링량만 수행하며 바이트 코드 인터프리터에 대한 입력/해제 비용은 없습니다가 변경 통역사. 제로 비용이 단 enter/leave에 유의해야 한다.try
블록.( 없bytecodes 블록 경계를 표시하기 위해서 발생하고 있다.)block.(블록 경계를 표시하기 위해 생성된 바이트 코드는 없습니다.)
그리고 베스트 서비스:
public class TryFinally {
public static void main(String[] argv) throws Throwable {
try {
throw new Throwable();
}
finally {
System.out.println("Finally!");
}
}
}
출력:
C:\JavaTools>java TryFinally
Finally!
Exception in thread "main" java.lang.Throwable
at TryFinally.main(TryFinally.java:4)
javap 출력:
C:\JavaTools>javap -c TryFinally.class
Compiled from "TryFinally.java"
public class TryFinally {
public TryFinally();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Throwable;
Code:
0: new #2 // class java/lang/Throwable
3: dup
4: invokespecial #3 // Method java/lang/Throwable."<init>":()V
7: athrow
8: astore_1
9: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
12: ldc #5 // String Finally!
14: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
17: aload_1
18: athrow
Exception table:
from to target type
0 9 8 any
}
'GOTO' 없어.
또 다른 마이크로벤치마크(소스).
예외 퍼센티지에 따라 try-catch 및 no-try-catch 코드 버전을 측정하는 테스트를 만들었습니다.10%는 테스트 사례의 10%가 0으로 나뉩니다.어떤 상황에서는 트라이캐치블록에 의해 처리되고 다른 상황에서는 조건부 연산자에 의해 처리됩니다.다음은 결과표입니다.
OS: Windows 8 6.2 x64
JVM: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 23.25-b01
퍼센트 | 결과(try/if, ns)0% | 88/901% | 89/8710% | 86/9790% | 85/83
그 말은 이 사건들 사이에 큰 차이가 없다는 거죠
최적화를 수행할 수 없는 이유를 이해하려면 기본 메커니즘을 이해하는 것이 유용합니다.가장 간결한 예는 C매크로(http://www.di.unipi.it/~nids/mapro/longjump_try_trow_mapro).
#include <stdio.h>
#include <setjmp.h>
#define TRY do{ jmp_buf ex_buf__; switch( setjmp(ex_buf__) ){ case 0: while(1){
#define CATCH(x) break; case x:
#define FINALLY break; } default:
#define ETRY } }while(0)
#define THROW(x) longjmp(ex_buf__, x)
컴파일러는 종종 점프를 X, Y, Z로 현지화할 수 있는지 판단하기 어렵기 때문에 안전하다고 보장할 수 없는 최적화는 건너뛰지만 구현 자체는 비교적 가볍습니다.
나는 꽤 비싸NullPointException를 잡고 발견했다.NullPoint Exception을데비용이 많이 듭니다 취득하는.1.2k 작업의 경우 시간이 200ms과 12ms 때 1.2k 조작의 경우,같은방법으로 조작했을 때와, 200ms와 12ms였습니다 시간은 같은 방식으로 handeled.if(object==null)
나한테는 예쁘다고 개선이다.제게는 꽤 나아진것 같아요.
언급URL : https://stackoverflow.com/questions/16451777/is-it-expensive-to-use-try-catch-blocks-even-if-an-exception-is-never-thrown
'sourcecode' 카테고리의 다른 글
vuej의 data-* 속성 값을 얻는 방법 (0) | 2022.08.10 |
---|---|
다른 데이터 개체 vueJ에 데이터 개체 값을 넣는 방법s (0) | 2022.08.10 |
글로벌 액세스 속성을 정의할 때 vuex DRY를 설정하는 방법 (0) | 2022.08.10 |
vuex 작업에서 반환된 약속에 final() 메서드가 firefox에 없습니다. (0) | 2022.08.10 |
C에 유용한 GCC 플래그는 무엇입니까? (0) | 2022.08.10 |