最近我一直试图弄清楚'重'一些陈述是。 例如,使用if语句检查每个可能的异常是否是一件好事,还是会大大减慢程序的速度?所以我低声想知道怎么重#'大量使用时会得到以下语句。这主要是出于好奇心的问题,因为今天的计算机速度如此之快,以至于它可能并不重要但它也可以帮助我在不同的做事方式之间做出选择,尽管性能提升可能只是微不足道。 / p>
一个简单的循环如何'沉重'循环本身不是它里面的代码吗?
while(true){}
for循环可能对while循环很熟悉吗?
for(int i = 0; true; i++){}
对于上面两个人来说,do while循环可能也很熟悉吗?
do{...}while(true)
if if语句' heavy'这会得到吗?
if(true){}
开关声明
switch(0){
case 0:
}
这是一个不那么重的转换声明'或者更重的'比else if
陈述
并检查如何重做'是吗?
if(obj instanceof Player){}
是null
检查我听说这个是真的'轻盈'那是真的吗?
if(obj == null){}
构造函数调用
new Object();
方法调用
MyClass.doSomething();
变量赋值
int i = 10;
我尝试在互联网上搜索,但我没有找到一个将所有内容相互比较或者熟悉的网页。但是,如果你们中的一些人有很好的文件,我会非常乐意阅读它。
答案 0 :(得分:1)
几乎所有东西的答案都是"它取决于"。这取决于JITC,这些调用中的内容,代码周围,代码有多热,分支预测器有多好等等。但是,如果您担心控制流结构的性能,那么您和' #39;几乎肯定在错误的地方寻找......
免责声明:如果您实际在循环中放入某些内容和/或评估"真实的"条件,因为评估那些会使控制流结构本身的成本相形见绌。但我现在只是简单地把所有内容都拿走了,否则我无法给出一个可靠的答案。
while(true){}
这可能会被JITC优化为无条件分支。所以不要"沉重的"一点都不。
for(int i = 0; true; i++){}
同样,JITC优化可能会将其转变为无条件分支+增量。 "较重"比while(true)
,但因为增量超过任何东西。可能会被JITC进一步优化;在这种情况下,可能会完全跳过增量。
do{...} while(true);
与while(true)
相同。可能被JITC优化为无条件分支。
if(true){}
如果在字节码编译中没有消除(并且它可能不是;我想我记得有关如何评估if
语句的控制流的一些特殊规则),那么它可能是由JITC优化为无操作,基本上可以从程序中删除。
switch(0){ case 0: }
不确定这个案例,但如果JITC完全优化了这一点,我不会感到惊讶。否则,switch
可以是跳转表或二进制搜索指令,具体取决于案例的稀疏程度。
这是一个不那么重的转换声明'或者更重的'比
else if
陈述
这完全取决于1)你是否可以使用一个而不是另一个,以及2)你要比较的。因此无法对此发表任何意见。
if(obj instanceof Player){} if(obj == null){}
这两个特定的片段可能会被JITC删除,否则我会期望instanceof
和== null
相当快,因为我认为有字节码指令我希望它会得到合理的优化。我不确定是否称这些"重"或者"光",因为没有比较点......
new Object();
我听说这些天创造的对象很便宜。如果你正在谈论实际的分配,那么我会选择" light"。但是,整个语句的性能取决于构造函数中的内容。
MyClass.doSomething();
取决于该方法是否已内联。如果是这样的话,它就会变得便宜。如果没有,那么它就是vtable查找的成本,这可能是昂贵的,也可能不是昂贵的。不确定。
int i = 10;
分配价值/参考可能并不昂贵,因为这是一个不错的程序......