Last active
October 23, 2015 09:20
-
-
Save ShinJJang/558772df8fcce974183e to your computer and use it in GitHub Desktop.
Check performance Exception in Java. ref: http://stackoverflow.com/questions/299068/how-slow-are-java-exceptions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Test { | |
int value; | |
CustomException _e; | |
public static class NestedException extends RuntimeException { | |
public NestedException() { | |
super(); | |
} | |
public NestedException(String message) { | |
super(message); | |
} | |
public NestedException(String message, Throwable cause) { | |
super(message, cause); | |
} | |
public NestedException(Throwable cause) { | |
super(cause); | |
} | |
// drop stackstrace | |
@Override | |
public Throwable fillInStackTrace() | |
{ | |
return this; | |
} | |
} | |
public static class CustomException extends NestedException { | |
public CustomException() { | |
super(); | |
} | |
public CustomException(String message) { | |
super(message); | |
} | |
public CustomException(String message, Throwable cause) { | |
super(message, cause); | |
} | |
public CustomException(Throwable cause) { | |
super(cause); | |
} | |
} | |
public int getValue() { | |
return value; | |
} | |
public void reset() { | |
value = 0; | |
} | |
// Calculates without exception | |
public void method1(int i) { | |
value = ((value + i) / i) << 1; | |
// Will never be true | |
if ((i & 0xFFFFFFF) == 1000000000) { | |
System.out.println("You'll never see this!"); | |
} | |
} | |
// Could in theory throw one, but never will | |
public void method2(int i) throws CustomException { | |
value = ((value + i) / i) << 1; | |
// Will never be true | |
if ((i & 0xFFFFFFF) == 1000000000) { | |
throw new CustomException(); | |
} | |
} | |
// This one will regularly throw one | |
public void method3(int i) throws CustomException { | |
value = ((value + i) / i) << 1; | |
// i & 1 is equally fast to calculate as i & 0xFFFFFFF; it is both | |
// an AND operation between two integers. The size of the number plays | |
// no role. AND on 32 BIT always ANDs all 32 bits | |
if ((i & 0x1) == 1) { | |
throw new CustomException(); | |
} | |
} | |
// create inteager rather than throw CustomException | |
public void method4(int i) throws CustomException { | |
value = ((value + i) / i) << 1; | |
// i & 1 is equally fast to calculate as i & 0xFFFFFFF; it is both | |
// an AND operation between two integers. The size of the number plays | |
// no role. AND on 32 BIT always ANDs all 32 bits | |
if ((i & 0x1) == 1) { | |
new Integer(1); | |
} | |
} | |
// not throw CustomException | |
public void method5(int i) throws CustomException { | |
value = ((value + i) / i) << 1; | |
// i & 1 is equally fast to calculate as i & 0xFFFFFFF; it is both | |
// an AND operation between two integers. The size of the number plays | |
// no role. AND on 32 BIT always ANDs all 32 bits | |
if ((i & 0x1) == 1) { | |
new CustomException(); | |
} | |
} | |
// parameter CustomException | |
public void method6(int i, CustomException e) throws CustomException { | |
value = ((value + i) / i) << 1; | |
// i & 1 is equally fast to calculate as i & 0xFFFFFFF; it is both | |
// an AND operation between two integers. The size of the number plays | |
// no role. AND on 32 BIT always ANDs all 32 bits | |
if ((i & 0x1) == 1) { | |
throw e; | |
} | |
} | |
// global CustomException | |
public void method7(int i) throws CustomException { | |
value = ((value + i) / i) << 1; | |
// i & 1 is equally fast to calculate as i & 0xFFFFFFF; it is both | |
// an AND operation between two integers. The size of the number plays | |
// no role. AND on 32 BIT always ANDs all 32 bits | |
if ((i & 0x1) == 1) { | |
throw _e; | |
} | |
} | |
public static void main(String[] args) { | |
int i; | |
long l; | |
Test t = new Test(); | |
t._e = new CustomException(); | |
System.out.println("Let's new test!"); | |
l = System.currentTimeMillis(); | |
t.reset(); | |
for (i = 1; i < 100000000; i++) { | |
t.method1(i); | |
} | |
l = System.currentTimeMillis() - l; | |
System.out.println( | |
"method1 took " + l + " ms, result was " + t.getValue() | |
); | |
l = System.currentTimeMillis(); | |
t.reset(); | |
for (i = 1; i < 100000000; i++) { | |
try { | |
t.method2(i); | |
} catch (CustomException e) { | |
System.out.println("You'll never see this!"); | |
} | |
} | |
l = System.currentTimeMillis() - l; | |
System.out.println( | |
"method2 took " + l + " ms, result was " + t.getValue() | |
); | |
l = System.currentTimeMillis(); | |
t.reset(); | |
for (i = 1; i < 100000000; i++) { | |
try { | |
t.method3(i); | |
} catch (CustomException e) { | |
// Do nothing here, as we will get here | |
} | |
} | |
l = System.currentTimeMillis() - l; | |
System.out.println( | |
"method3 took " + l + " ms, result was " + t.getValue() | |
); | |
l = System.currentTimeMillis(); | |
t.reset(); | |
for (i = 1; i < 100000000; i++) { | |
try { | |
t.method4(i); | |
} catch (CustomException e) { | |
// Do nothing here, as we will get here | |
} | |
} | |
l = System.currentTimeMillis() - l; | |
System.out.println( | |
"method4 took " + l + " ms, result was " + t.getValue() | |
); | |
l = System.currentTimeMillis(); | |
t.reset(); | |
for (i = 1; i < 100000000; i++) { | |
try { | |
t.method5(i); | |
} catch (CustomException e) { | |
// Do nothing here, as we will get here | |
} | |
} | |
l = System.currentTimeMillis() - l; | |
System.out.println( | |
"method5 took " + l + " ms, result was " + t.getValue() | |
); | |
l = System.currentTimeMillis(); | |
t.reset(); | |
for (i = 1; i < 100000000; i++) { | |
try { | |
CustomException e = new CustomException(); | |
t.method6(i, e); | |
} catch (CustomException e) { | |
// Do nothing here, as we will get here | |
} | |
} | |
l = System.currentTimeMillis() - l; | |
System.out.println( | |
"method6 took " + l + " ms, result was " + t.getValue() | |
); | |
l = System.currentTimeMillis(); | |
t.reset(); | |
for (i = 1; i < 100000000; i++) { | |
try { | |
t.method7(i); | |
} catch (CustomException e) { | |
// Do nothing here, as we will get here | |
} | |
} | |
l = System.currentTimeMillis() - l; | |
System.out.println( | |
"method7 took " + l + " ms, result was " + t.getValue() | |
); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment