发送不必要的对象有多少影响?

时间:2018-11-24 20:53:09

标签: java performance

我经常遇到需要将许多对象用作方法参数的情况,但是所有或几乎所有这些对象都可以从另一个对象引用。就我而言,我拥有许多对象,例如粒子管理器和射弹管理器,它们都是屏幕对象的属性。有时,我只是将整个屏幕对象作为参数来节省时间,以获取所需的任何对象。

这是好习惯吗?一方面,它节省了我的时间,但是当我将其作为参数发送时,我不知道额外的(不必要的)信息对屏幕对象的影响。这效率低下吗?

3 个答案:

答案 0 :(得分:1)

因此,您有一个Screen对象,其中包含许多其他方法需要的有用字段,并且您懒得将这些字段传递给那些方法,因此使所有方法都接受一个{ }}对象,则只需传递Screen

希望我能正确理解您的情况。

这实际上并不意味着您正在内存中移动不必要的数据。对象本身作为参数传递时不会被复制。仅复制其地址,这与您传递各个字段时的数据大小相同。地址大小都相同。因此,这可能不会导致性能问题。

但是,这可能是错误的设计。通过将Screen传递给您的方法,您使您的方法依赖于Screen。如果您的方法与UI无关,则它们不应依赖于Screen,对吗?他们也应该在没有Screen的情况下工作。

此外,您的Screen可能是神灵课,并且违反了单一责任原则。您可能要重构它。

答案 1 :(得分:0)

一般来说很难说。添加额外的参数意味着对堆栈的额外压入,通常将其编译为...对堆栈的额外压入。因此,无论它是在解释模式下还是在编译模式下运行,每个调用都会多推一次。但这相当便宜。相比之下,通过调用另一个方法或仅取消引用变量来获取同一对象可能很快,也可能会稍慢一些-这取决于当时L1和L2缓存中发生了什么,这可能与拨打电话。但是无论哪种方式,都不会复制对象(与C ++不同)。因此,总而言之……这取决于您,一般而言,您可能不必担心太多。如果速度很慢,请首先分析您的代码,然后仅关注比其慢得多的系统部分。

答案 2 :(得分:0)

对我来说,传递一个context-这就是我所说的“传输”对象的合适方式。如前所述,如果您希望将来支持对该对象的某些部分进行添加或删除,这很容易做到。

但是在某些情况下,我只传递单独的部分。当您想测试一个方法并且一个方法需要更多对象时就是这种情况-我希望测试失败。

 // context contains first and second
 public void testMe(Context context) {

 }

vs

 public void testMe(String first, String second){

 }

context添加一个参数,例如String third-很可能会使您的测试通过;但是向需要两个参数的方法增加了一个参数...忽略编写单元测试很容易,而忽略编译错误则要困难得多。因此,有时由于这个原因,我们的代码需要更多的参数。

就性能而言,我怀疑您是否会感到与众不同(即使存在),毕竟传递对象实际上是传递引用。