Написал небольшой тестик:
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
Тест, конечно, не претендует на большую точность, однако порядок величин показывает.