考虑"if"语句和异常的长时间性能成本

san*_*lto 4 java performance exception

我一直认为使用"if"比捕获异常更好(在性能方面).例如,这样做:

User u = Users.getUser("Michael Jordan");
if(u!=null)
   System.out.println(u.getAge());
Run Code Online (Sandbox Code Playgroud)

User u = Users.getUser("Michael Jordan");
try{
   System.out.println(u.getAge());
}catch(Exception e){
   //Do something with the exception
}
Run Code Online (Sandbox Code Playgroud)

如果我们对此进行基准测试,则很明显第一个片段比第二个片段快.这就是我一直以来的想法.但是,昨天,一个人告诉我这样的事情:

您是否考虑过在数千次执行程序中会发生什么?每次你的执行都通过你的"如果"你有一点(真正的小,但仍然是某些)性能成本.除了例外,它不会发生.因为它永远不会出现.

为了说清楚:数千次执行"if"与一个异常捕获.

我认为它有道理,但没有任何证据.

你能帮助我吗?

谢谢!!

ilu*_*uxa 9

永远都不要牺牲你的代码质量来达到性能,直到你已经证明它超出了合理的怀疑,它实际上是需要的.我非常怀疑if()语句的性能是否会成为你编程的瓶颈.如果是这样,你应该用C重写它.在Java领域,99%的时间瓶颈是I/O--磁盘和/或网络.


Mik*_*uel 8

不会.一旦JIT开始,就不要了.请告诉他阅读跟踪缓存.

动态跟踪("跟踪路径")仅包含实际使用结果的指令,并消除采用分支后的指令(因为它们未被执行); 动态跟踪可以是多个基本块的串联.这允许处理器的指令获取单元获取几个基本块,而不必担心执行流中的分支.

基本上,如果每次通过循环体获取相同的分支,则该主体最终作为跟踪缓存中的单个跟踪.处理器不会产生获取额外分支指令的成本(除非将基本块推到可以存储在跟踪高速缓存中的限制,不太可能)并且不必在开始之前等待测试结果执行以下说明.