这可能是在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前缀字段将用于其他方法,旨在保存仅用于中间计算的临时值。
我看到它的方式,如果你注意到使用全局变量的常见警告,这可以节省内存和时间。
答案 0 :(得分:4)
如果你将它实例化3000次(这并不多),并且一次只有一个以上,那么你就是在乞求一种不确定的非确定性竞争条件。为什么不直接使用当地人并消除所有疑虑?
当方法运行完毕后,本地会消失,而不像将来在不确定的时间内进行GC操作的实例变量。
答案 1 :(得分:1)
通常,静态变量的访问速度比实例字段慢(或者至少没有更快),并且方式比局部变量慢。静态的唯一两个原因是,如果你需要一些先前事件的类范围“内存”,或者你有一些常见的(基本上是只读的)对象(例如日历对象),这些对象可以通过类中的方法重复访问
将静态用于int或其他一些可能只是局部变量的标量是非常低效的。
对于高度可变的对象(如StringBuilder)使用静态也是非常危险的。从methodA调用到methodB,你可能意外地使用相同的对象,结果不好。 (更不用说线程应用程序的问题了。)
(应该指出,分配一个局部变量 - 无论是缩放器int / float / what还是一个对象引用,基本上没什么代价。而且添加一个实例字段的成本非常低 - {{ 1}}时间初始化只是将空间归零的时间(这基本上就是它来自堆的方式)。)
答案 2 :(得分:0)
其他人已经建议并且我会同意它会在速度上产生微不足道的差异,并且是非常糟糕的形式,会在你最不期望的时候咬你或同事。
然而,如果您不相信,那么创建一个微基准测试来证明实现之间几乎没有区别。创建方法的两个不同版本然后用随机值n计算100,000或10,000,000个函数的时间应该是一件容易的事,并且看看每个版本需要多长时间。