在Java/Android中引入变量的更好方法是什么?
第一个示例是否生成更高效的代码 在Java/Android和Java中的排名第二 至少第一个例子不能比第二个慢, 我想 在这里,我不关心变量v在第一个变量中的生存时间是否更长 例如,也许长时间地消耗记忆 当然,第二种方法确实更具可读性 如果您有多个内部块的更复杂的代码。 这也不是这里的问题在Java/Android中引入变量的更好方法是什么?,java,android,Java,Android,第一个示例是否生成更高效的代码 在Java/Android和Java中的排名第二 至少第一个例子不能比第二个慢, 我想 在这里,我不关心变量v在第一个变量中的生存时间是否更长 例如,也许长时间地消耗记忆 当然,第二种方法确实更具可读性 如果您有多个内部块的更复杂的代码。 这也不是这里的问题 MyType v; for(int i=0;i<bigCount;++i) { v = <value produced for i>; //do something with v }
MyType v;
for(int i=0;i<bigCount;++i)
{
v = <value produced for i>;
//do something with v
}
for(int i=0;i<bigCount;++i)
{
MyType v = <value produced for i>;
//do something with v
}
myv型;
对于(int i=0;i我会选择第二个选项,因为v
变量范围在for
循环中。它不需要在循环之外的任何地方使用
这样,创建并分配给v
的对象可以更早地进行垃圾收集。或者至少最后一个对象可以比第一段代码更快地进行垃圾收集。要防止多次分配,可以在其自身范围内关闭变量,如下所示:
{
MyType v;
for(int i=0;i<bigCount;++i)
{
v = <value produced for i>;
//do something with v
}
}
{
MyV型;
对于(int i=0;i我创建了一个最小的示例:
public void option1() {
String s;
for (int i = 0; i < foo; i++) {
s = String.valueOf(i);
}
}
public void option2() {
for (int i = 0; i < foo; i++) {
String s = String.valueOf(i);
}
}
选项2()
:
0 iconst\u 0
1史努比1
2转到13(+11)
5伊洛德1
6.房地产#17
9 astore_2
10 iinc 1乘1
13伊洛德1
14 aload_0
15格特菲尔德#23
18如果icmplt 5(-13)
21返回
我的猜测是,如果编译器看到,在循环之前创建的变量永远不会在循环之后使用,它只是将其定义拉入循环中。因此,在您的情况下,两者都不是更有效的。所以选择一个更可读的(option2()
).也许您可以检查它,尝试测量两个循环的运行时间和内存使用情况编写最干净的代码(即第二个)。大多数情况下,最干净的代码意味着更快的代码。在这种情况下,我的猜测是,这是一个不会产生任何重大影响的微优化。我从来没有说过在第一种情况下,它不符合GC。我只是说在第一种情况下,它符合更早的条件。实际上,这并不总是正确的。许多JVM实现,包括ORacle one,allow to come to existance。实际上,这是非常罕见的,但也是可能的。引用超出Java语言变量范围的意义并不总是意味着引用也超出了实现的范围(在JVM中存储变量的实际低级堆栈).不过,在大多数情况下,我更关心的是编码风格,而不是这些微妙之处。
0 iconst_0
1 istore_2
2 goto 13 (+11)
5 iload_2
6 invokestatic #17 <java/lang/String/valueOf(I)Ljava/lang/String;>
9 astore_1
10 iinc 2 by 1
13 iload_2
14 aload_0
15 getfield #23 <MethodTest/foo I>
18 if_icmplt 5 (-13)
21 return
0 iconst_0
1 istore_1
2 goto 13 (+11)
5 iload_1
6 invokestatic #17 <java/lang/String/valueOf(I)Ljava/lang/String;>
9 astore_2
10 iinc 1 by 1
13 iload_1
14 aload_0
15 getfield #23 <MethodTest/foo I>
18 if_icmplt 5 (-13)
21 return