我正在学习Java课程并且对专业性和效率有疑问。我已经读过,最好不要创建临时变量。
我已正确回答了其中一个测验问题:
public void removeLowest(){
remove(find(lowScore())); //doesn't really read very easily
}
答案分解为每一步:
public void removeLowest(){
double low = lowScore();
int lowScoreIndex = find(low);
remove(lowScoreIndex);
}
两个版本完成相同的任务,但哪个更好?
感谢。
答案 0 :(得分:4)
就速度效率而言,两者都是相同的。但是,第一个节省了一些内存而不是分配内存来存储堆栈中返回的值。一般来说,出于两个原因,人们不担心在这种情况下使用堆栈内存。首先,堆栈是灵活的,可以存储大量的临时数据。其次,为了以后查看代码,给函数的返回值一个名称,使代码对于作者和修改代码的其他人更具可读性。
答案 1 :(得分:2)
这是一个很难回答的问题,因为对这两个论点都有一些看法。但是,如果我们查看每个字节代码:
删除最低无中间体
public void removeLowest();
Code:
0: aload_0
1: aload_0
2: aload_0
3: invokespecial #2 // Method lowScore:()D
6: invokespecial #3 // Method find:(D)I
9: invokespecial #4 // Method remove:(I)V
12: return
中间人最低
public void removeLowest2();
Code:
0: aload_0
1: invokespecial #2 // Method lowScore:()D
4: dstore_1
5: aload_0
6: dload_1
7: invokespecial #3 // Method find:(D)I
10: istore_3
11: aload_0
12: iload_3
13: invokespecial #4 // Method remove:(I)V
16: return
因此,您可以在此处看到中间体确实需要更多操作和存储。但是,请记住JVM是智能的 - 因此在运行时它可能会对此字节码执行优化。如果您将此调用一定次数,则无论如何都会将方法全部内嵌到同一个块中并删除本地存储。
就你的问题而言,我的目的是为了提高阅读能力而不是以易读性为代价来编写更紧凑的代码。这纯粹是因为你的代码 - >字节代码 - >热点很多都会发生,以优化这段代码,您的主要关注点是尽可能编写最易维护的代码。正如其他人所提到的那样,一些中间存储值在较大的图景中代表意义成本很少。
答案 2 :(得分:1)
你是对的 - 他们都做同样的事情! 但是,唯一的区别是通过创建变量,您还可以创建运行该方法的Thread所拥有的LocalVariableReference。这引用了内部方法返回的返回值(例如getLow())。这意味着通过为它们声明变量来命名返回的值会占用更多内存。 尽管如此,它使代码更容易阅读,老实说,所占用的空间非常小,可以忽略不计! (它只是对价值的引用 - 非常小的数据)
底线:做一些更舒服的阅读和调试。
答案 3 :(得分:1)
对于一小组变量名称直观的语句,即使您的第一个代码示例也非常好。在第二种情况下,代码更详细,更容易理解。 (不是说冗长==理解)。
Efficiency
:至少在这种特殊情况下,你不需要太担心它。正确地指出Jim,JVM比我们假设的更聪明,并且可以根据需要进行优化。只要您将变量/对象放在正确的范围内,也不要太担心空间。 (方法,类,实例)。请记住,当我们说java程序时,我们正在谈论managed code
,所以如果你赞成第一个以提高效率,我会说不会影响太多。
Professionalism
:这里第二个例子很受欢迎(作为练习演示者),还有一个方面,maintainability
。类似的用法可能会闪耀。 (*可维护性不仅取决于此)
有些语言不那么冗长,而且对于大型代码库仍然有效。