如果类都包含许多有用的类变量,它会对性能产生影响吗?

时间:2012-08-08 08:36:35

标签: java performance class variables

每当我写一个新类时,我都会使用相当多的类变量来描述类的属性,直到我回去查看我输入的代码时,我看到了40到50个类变量无论它们是公开的,受保护的还是私人的,它们都在我定义的各个阶段中占据显着位置。

尽管,类变量主要由原始变量组成,如布尔值,整数,双精度等,但我仍然有这种不安的感觉,我的一些具有大量类变量的类可能对性能产生影响,但它们可能是微不足道的。

但是尽可能合理,如果我考虑无限的RAM大小和无限的Java类变量,Java类可能是RAM中的无限大的内存块,其中块的第一部分包含类变量分区,并且块的其余部分包含Java类中类方法的地址。有了这么多的RAM,它的性能非常重要。

但上述情况并没有让我的感受变得容易。如果我们考虑有限的RAM但是无限的Java类变量,结果会是什么?在性能重要的环境中会发生什么?

可能事先可能会提到,我不知道是否有很多类变量被认为是糟糕的Java实践,当它们都很重要时,所有类都被重构了。

提前致谢。

7 个答案:

答案 0 :(得分:19)

性能与对象具有的字段数无关。内存消耗当然可能会受到影响,但如果需要变量,则无法对其进行太多操作。 不要过分担心性能问题。使您的代码简单,易读,可维护,经过测试。然后,如果您发现性能问题,请测量并分析它们的来源,并根据需要进行优化。

可维护性和可读性受到对象具有的字段数的影响。 40到50个字段是相当多的字段,可能表明你的课程本身做得太多,并且责任太多。将它们重构为许多较小的子类,并使用组合可能是一个好主意。

答案 1 :(得分:5)

我希望我听起来不像是一个屁股,但在我看来,一个类中有超过10个属性通常是一个糟糕的设计,需要证明理由。

性能方面,如果经常需要所有这些属性,那么您将节省一些内存,因为每个对象也有一个标头。因此,你将5-10个类放入一个并节省一些字节。

根据您使用的垃圾收集器,拥有更大的对象可能会更昂贵(CMS垃圾收集器也是如此,但对于并行垃圾收集器则不然)。更多GC工作=减少您的应用运行的时间。

除非您正在编写高流量,低延迟的应用程序,否则更少的类(以及使用更少的内存)的好处将完全被维护所需的额外工作所淹没。

答案 2 :(得分:3)

我看到一个包含大量变量的类的最大问题是线程安全 - 在这种情况下很难推断出不变量。阅读/维护这样的课程也会非常困难。

当然,如果你尽可能多地制作不可变的字段,那将会更好。

我尝试着:越少越好,越容易维护。

答案 3 :(得分:1)

我们总是教导的一个基本原则是保持高凝聚力(一个类专注于一个任务)和低耦合(类之间的相互依赖性较小,以便一个中的变化不会影响其他任务)。

在设计系统时,我会相信重点应放在可维护的设计上,性能会自行解决。我不认为一个类可以拥有的变量数量有一个固定的限制,因为这将严格取决于您的要求。

例如,如果我有一个要求,其中应用程序向学生建议课程,并且算法需要50个输入(分数,爱好等),那么这些数据是在一个类还是多个中可用并不重要,因为整体需要将信息加载到RAM中以加快执行速度。

我将再次说,照顾你的设计,将不必要的变量保存在类中是有害的(因为它会将不需要的信息加载到RAM中)或拆分成比需要更多的类(更多引用因此指针运动)

答案 4 :(得分:1)

1。我总是把它用作规则的拇指。 一个班级应该只有一个改变的理由,所以它应该只做一件事。

2。记住这一点,我会采用定义此类属性所需的变量。

3。我确保我的班级遵循Cohesive principle,其中班级中的方法反映了班级名称。

4。现在将所有内容排序后,如果我需要一些其他变量来完成我的课程,那么我需要使用它们,我别无选择......而且经过所有这些思考并且创建一个类的工作几乎不会受到一些额外变量的影响。

答案 5 :(得分:0)

有时类变量用作静态最终常量来存储一些默认字符串,如产品名称,版本,操作系统版本等。甚至可以存储产品特定的设置,如字体大小,类型等。这些静态变量可以保存在班级。

如果您只想存储字段常量或类似很少更改的产品设置,也可以使用HashMap而不是简单类。这可能会帮助您加快响应时间。

答案 6 :(得分:0)

我想提两件事: 1.所有实例变量都存储在RAM的堆区域中。 2.所有静态变量都存储在非堆区域中(方法区域是特定的)。

无论是变量类型(实例还是静态),最终都存在于RAM中。

现在回答你的问题。就实例变量而言,java的内置垃圾收集器在大多数情况下可以很好地和有效地工作,以保持释放内存。但是,静态变量不是垃圾回收。

如果您高度关注由于类中存在大量变量而导致的内存问题,则可以使用弱引用而不是传统的强引用。