Java中是否存在使用try/catch块的开销,而不是if块(假设所附的代码没有请求)?
例如,对字符串采用以下两种简单的"安全修剪"方法:
public String tryTrim(String raw) {
try {
return raw.trim();
} catch (Exception e) {
}
return null;
}
public String ifTrim(String raw) {
if (raw == null) {
return null;
}
return raw.trim();
}
Run Code Online (Sandbox Code Playgroud)
如果raw
输入很少null
,两种方法之间是否有任何性能差异?
此外,使用该方法简化代码布局是一种很好的编程模式tryTrim()
,特别是当通过将代码封装在一个try/catch块中可以避免许多if块检查稀有错误条件时?
例如,一个常见的情况是使用一个方法N parameters
,M <= N
在其开始附近使用它们,如果任何这样的参数是"无效的"(例如,空或空字符串),则快速且确定地失败,而不影响其余的码.
在这种情况下,不必编写k * M
if块(其中k
每个参数的平均检查次数,例如k = 2
对于null或空字符串),try/catch块将显着缩短代码并且可以使用1-2行注释明确地注意到"非常规"逻辑.
这样的模式也会加速该方法,特别是如果错误条件很少发生,并且它会这样做而不会影响程序安全性(假设错误条件是"正常"的,例如在字符串处理方法中为null或空值)是可以接受的,虽然很少存在).
哪一个更快:
这个
try {
n.foo();
}
catch(NullPointerException ex) {
}
Run Code Online (Sandbox Code Playgroud)
要么
if (n != null) n.foo();
Run Code Online (Sandbox Code Playgroud) 这可能看起来像一个原始问题,或者可以通过我不知道的简单实用程序库方法来完成。
目的是检查嵌套在两个对象下的布尔字段的值。
private boolean sourceWebsite(Registration registration) {
Application application = registration.getApplication();
if (application == null) {
return true;
}
Metadata metadata = application.getMetadata();
if (metadata == null) {
return true;
}
Boolean source = metadata.getSource();
if (source == null) {
return true;
}
return !source;
}
Run Code Online (Sandbox Code Playgroud)
我知道这可以一次完成if()
。if
为了可读性,我在这里添加了多个。
有没有一种方法可以简化上面的if
语句,并有一个简单的实用工具类返回Boolean source
父对象是否为null的值?
通常我更喜欢空检查.但在目前的情况下,我知道大部分时间我的if条件都会通过,并且很少有合法的场景,其中object可能为null.
此外,负载是巨大的(约500万次电话/小时)
现在我试图从性能角度找出哪种方式更好.已经检查过java中的try/catch vs null检查,但我的情况是唯一的.
还检查哪个更快,在java中尝试catch或if-else(WRT性能)但是这个和上面的都是在通用上下文中,其中通过/失败比率的知识不可用.
public void process(Job job) {
//... some code which processes job
SubJob subJob = job.getSubJob();
if(subJob != null) { // 99% of the time this will pass
//.. do something
}
}
Run Code Online (Sandbox Code Playgroud)
尝试/捕捉版本
public void process(Job job) {
//... some code which processes job
SubJob subJob = job.getSubJob();
try {
//.. do something
}catch(NullPointerException e) { //This may occure only 1% of the time.
//...
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
获胜者是空检查.在Try/catch中,内部JVM将执行空检查并且无论如何都会抛出NPE,并且在JVM中创建异常处理(堆栈等的创建)将是开销.另外,根据另一个答案,现代CPU足够聪明,可以通过良好的预测来处理这些情况,在我的独特案例中,这些预测总是有利于.
我还编写了程序(在我的名字下面发布),结果清楚地表明我的AMD处理器上的空检查更好. …