使用静态全局工作变量是否有优势?

时间:2012-09-06 22:07:51

标签: java

这可能是在nits上挑选,但是对于一次性工作变量使用全局静态字段是否有任何时间/内存效率?鉴于这个微不足道的例子:

class theClass {

private static GregorianCalendar wkCal;
private static int wkTimes1;
private static int wkTimes2;
private static int wkTimes3;
private static StringBuilder wkSb = new StringBuilder();

void aMethod(int n) {
    wkTimes1 = n * 1;
    wkTimes2 = n * 2;
    wkTimes3 = n * 3;
    wkCal = new GregorianCalendar();
    wkSb.setLength(0);
    wkSb.append("A string"); 
    // And so on...
}
}

此代码段有可能多次实例化(> 3000)并且每次实例化多次使用aMethod。此外,wk前缀字段将用于其他方法,旨在保存仅用于中间计算的临时值。

我看到它的方式,如果你注意到使用全局变量的常见警告,这可以节省内存和时间。

3 个答案:

答案 0 :(得分:4)

如果你将它实例化3000次(这并不多),并且一次只有一个以上,那么你就是在乞求一种不确定的非确定性竞争条件。为什么不直接使用当地人并消除所有疑虑?

当方法运行完毕后,本地会消失,而不像将来在不确定的时间内进行GC操作的实例变量。

答案 1 :(得分:1)

通常,静态变量的访问速度比实例字段慢(或者至少没有更快),并且方式比局部变量慢。静态的唯一两个原因是,如果你需要一些先前事件的类范围“内存”,或者你有一些常见的(基本上是只读的)对象(例如日历对象),这些对象可以通过类中的方法重复访问

将静态用于int或其他一些可能只是局部变量的标量是非常低效的。

对于高度可变的对象(如StringBuilder)使用静态也是非常危险的。从methodA调用到methodB,你可能意外地使用相同的对象,结果不好。 (更不用说线程应用程序的问题了。)

(应该指出,分配一个局部变量 - 无论是缩放器int / float / what还是一个对象引用,基本上没什么代价。而且添加一个实例字段的成本非常低 - {{ 1}}时间初始化只是将空间归零的时间(这基本上就是它来自堆的方式)。)

答案 2 :(得分:0)

其他人已经建议并且我会同意它会在速度上产生微不足道的差异,并且是非常糟糕的形式,会在你最不期望的时候咬你或同事。

然而,如果您不相信,那么创建一个微基准测试来证明实现之间几乎没有区别。创建方法的两个不同版本然后用随机值n计算100,000或10,000,000个函数的时间应该是一件容易的事,并且看看每个版本需要多长时间。