0

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

我有一个充满参数的字符串数组,我必须多次检查它的长度,所以,最好将参数的数量(数组长度)保存在变量中,或者每次都调用长度?我想存储一个变量会消耗更多的内存,而另一种方式会使用更多的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

ETC

或者

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

4 回答 4

4

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

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

于 2013-08-23T22:10:53.137 回答
1

首先:您不能将存储与速度进行比较,它们是不同的东西。你能做的是确定你对每个人的重视程度。如果您需要 100% 的速度,您将选择速度选项,反之亦然。

通常你想要一个平等的考虑,这让我们明白:这取决于你自己的喜好。您会经常访问该物业吗?也许将它存储在变量中很有趣。

亲自看看你发现什么更容易使用:你的例子对任何一种方式都没有什么影响。检索列表的大小已存储在变量中,因此不会进行循环。

于 2013-08-23T22:13:16.380 回答
0

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

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

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

抛开一切,因为长度被多次使用,创建一个变量是一个好习惯。

干杯!!

于 2013-08-23T22:29:25.963 回答
-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();

} 

从长远来看,经过深思熟虑的架构很可能会产生更好的性能。

于 2013-08-23T22:18:13.297 回答