根据我的一个高级编码风格2的性能比编码风格1更好,是真的吗?
编码风格1
If (obj!=null)
{
Logic A
}
else
{
Logic B
}
编码风格2
If (obj==null)
{
Logic B
}
else
{
Logic A
}
答案 0 :(得分:5)
在这样的例子中,您应该担心的是开发人员的表现。什么是最干净,最简单的代码,这通常是一个JIT优化器将做得很好的模式,如果不是最好的工作。
在这个例子中,即使您可以测量差异,我也会怀疑
答案 1 :(得分:2)
只能在机器代码级别上观察是否更快地测试null或非null,您几乎无法控制。您的Java文件将被编译为字节码,然后在运行时,该字节码将由Just-in-Time编译器(JIT)再次编译为机器代码。 JIT执行所有高级优化的孩子,其中一个可能是分支条件反转的分支重新排序。
请注意,用于测试变量值的CPU周期将与分支错误预测中的惩罚相比相形见绌,因此正确的分支预测是JIT编译器最关注的问题。您在Java源代码级别上完全无法控制这些细微之处。
因此,一致的建议是注意编写最自然的代码,不要再考虑分支排序的性能差异。
答案 2 :(得分:1)
表现不应该像
我猜你的朋友没有谈论表现,而是讨论编码风格。
当使用if else
构造时,人们经常发现在处理if
块中的否定情况之前,首先处理else
块中的非否定情况更为可取。
所以最好写一下
if (a == b) {
logicA();
}
else {
logicB();
}
而不是写
if (a != b) {
logicB();
}
else {
logicA();
}
因为它通常会导致更好的可读性。
答案 3 :(得分:0)
您的大四学生应提供“可衡量的”测试用例,以向您证明哪种逻辑更好。
您不必担心优化逻辑,因为编译器会为您完成所有优化。相反,关注代码的可读性(和流逻辑?)。例如,Java 7引入了<T> T Objects.requireNotNull(T obj)
方法,该方法在内部执行:
if (obj == null) {
throw new NullPointerException();
}
return x;
哪个更好,特别是在创建API时,因为你有一个“断言”/保证不为空的业务逻辑。