关于性能(内存或CPU)

时间:2013-08-23 22:05:52

标签: java performance

这个问题是关于java编码的,我的问题很容易,所以我将用一个小例子来解释它:)

我有一个充满参数的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更好,而不是检查数百万次,而不是检查总是相同的变量值,你怎么看?

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

首先:你无法将存储与速度进行比较,这些是不同的东西。 你能做的就是确定每个人的价值。如果您需要100%的速度,您将选择速度选项,反之亦然。

通常你想要一个平等的考虑,这就把我们带到了这个: 这取决于你自己的偏好。你经常访问该物业吗?也许将它存储在一个变量中很有意思。

亲眼看看你觉得哪些更容易使用:你的例子对这两种方式的影响都很小。检索列表的大小已存储在变量中,因此不会进行循环。

答案 2 :(得分:0)

两者的不同之处在于创建一个额外的变量而不是获取数组的长度,差异将取决于您如何使用此代码。

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

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

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

干杯!!

答案 3 :(得分:-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();

} 

从长远来看,更好的思考架构最有可能产生更好的性能。