2013-08-23 29 views
0

这个问题是关于Java编码,我的问题是很容易,所以我会用一个小例子:)关于性能(内存或CPU)

我有一个String数组充满争论解释它,我必须检查它的长度几次,所以,最好将变量的数量(数组长度)保存在一个变量中,或者每次调用长度?我想存储变量会消耗更多的内存,反之亦然使用更多的CPU,只想问你认为什么更好,谢谢!

例子:

String[] arguments = {"a","b","c"}; 
int numberOfArguments = arguments.length; 
if(numberOfArguments == 1)do whatever 
if(numberOfArguments == 2)do whatever 
if(numberOfArguments == 3)do whatever 

OR

String[] arguments = {"a","b","c"}; 
if(arguments.length == 1)do whatever 
if(arguments.length == 2)do whatever 
if(arguments.length == 3)do whatever 

编辑:我知道其中的差别将是非常小的..但我要请一个漫长的过程,认为大,一百万个“arguments.length”,所以对于这种情况,我认为牺牲一个超小的内存来存储这个变量对于cpu来说应该更好一些,而不是检查长度为一百万t的变量imes比检查一个总是相同的变量值,你觉得怎么样?

+2

当你检查字节码时,你会发现什么? –

+1

我怀疑你会注意到很大的不同。无论如何,我同意@HovercraftFullOfEels你应该比较结果字节代码来检查编译之后是否有任何区别。在附注中,“switch..case”怎么样? –

+5

这两种情况下内存消耗和CPU负载的差异非常微小,如果您的代码在80年代的计算机上运行,​​您将无法注意到它。 – Renan

回答

4

这是一个不成熟的优化;做任何你发现更可读/更容易管理的东西。就个人而言,我更喜欢直接引用length字段,因为我认为没有必要将它存储在另一个变量中(除非数组的长度在程序上下文中的含义与简单计数元素不同 - 在这种情况下,将其存储在合理命名的变量中可能是适当的)。无论如何,您可以放心,两者之间没有明显的性能差异。

顺便说一句,array.length甚至可能在某些情况下更快(假设你能够看到任何时间任何区别),比存储在一个局部变量的长度和使用代替。甚至有一个字节码操作数专门为此保留:bearraylength),更不用说将会在此过程中进行优化。

1

首先:你不能比较存储和速度,这些是不同的东西。 你可以做的是确定你对每个值有多重要。如果你需要100%的速度,你会选择速度选项,反之亦然。

通常情况下,您需要一个平等的考虑因素,这使我们能够: 这取决于您自己的偏好。你会经常访问那个属性吗?也许把它存储在一个变量中很有趣。

请亲自看看您发现哪些方面更易于使用:您的示例对这两种方式的影响都很小。检索一个列表的大小已经存储在一个变量中,所以没有循环。

+0

这不是一个比较,我问你的意见,如果你认为更好地使用内存或CPU,而不是比较两者。 –

-1

面向对象编程可以节省您不必做很长的if语句。计算一次参数的数量,并为该场景创建特定类的实例。然后,您可以调用该实例的任何方法,并针对该情况采取“采取行动”的方式。

(原谅我生锈的Java ...)

public interface Arguments{ 

    void foo(); 
} 

public class OneArgument implements Arguments{ 


    public void foo(){ 
     // do whatever 
    } 
} 

public class TwoArguments implements Arguments{ 


    public void foo(){ 
     // do whatever 
    } 
} 

public class ThreeArguments implements Arguments{ 


    public void foo(){ 
     // do whatever 
    } 
} 

然后你可以有一个工厂方法:

public static Arguments create(String[] args){ 

    if(args.length == 1) return new OneArgument(); 
    else if(args.length == 2) return new TwoArguments(); 
    else if(args.length == 3) return new ThreeArguments(); 
    else throw new Exception(); 

} 

更好的深思熟虑的架构将最有可能在长期内获得更好的性能。

0

两者的区别在于创建一个额外变量与获取数组长度的差别取决于您如何使用此代码。

如果您创建了此类的数百万个实例,那么在第一种方法中,您将创建百万个变量,现在您可以考虑在第一种方法中更多地使用内存。

读取数组的长度并不昂贵,所以简而言之,它取决于您的项目中如何使用此代码。

把所有东西放在一边,因为长度被多次用来创建变量是一种很好的做法。

干杯!