0

这可能是在挑剔,但是在使用全局静态字段来处理一次性工作变量时是否有任何时间/内存效率?给出一个简单的例子:

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 前缀字段将用于其他方法,旨在保存仅用于中间计算的临时值。

在我看来,如果您注意有关使用全局变量的常见警告,这可以节省内存和时间。

4

3 回答 3

4

如果您将其实例化 3000 次(这并不多),并且一次不止一次,那么您正在乞求一个很好的非确定性竞争条件。为什么不只使用当地人并消除所有疑问?

当方法完成运行时,局部变量会消失,这与实例变量不同,实例变量将在未来不确定的时间内被 GC。

于 2012-09-06T22:12:41.407 回答
1

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

将静态用于 int 或其他一些可以作为局部变量的标量确实效率低下。

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

(应该指出的是,分配一个局部变量基本上没有任何成本——无论是缩放器 int/float/whatever,还是对象引用。添加实例字段的成本也很低——new初始化时间只是是时候将空间归零(这基本上是它来自堆的方式)。)

于 2012-09-06T22:41:20.947 回答
0

其他人提出了建议,我同意它对速度的影响可以忽略不计,而且是一种非常糟糕的形式,会在你最不期望的时候咬你或同事。

但是,如果您不相信,那么创建一个微基准来证明实现之间几乎没有差异。创建该方法的两个不同版本,然后使用 n 的随机值对函数的 100,000 或 10,000,000 次执行计时,并查看每个执行需要多长时间,这应该是一件容易的事。

于 2012-09-07T00:46:10.547 回答