2010-11-01 49 views
3

我知道规则#1的优化是:不要这样做!但我认为这是一个简单的问题,如果我现在开始使用更快的方法,那么当完成时我可以节省大量的CPU时间。优化:访问字段与方法

我正在做一个RPG游戏,让我们说这是一个自定义类的一部分:

public class Baddie{ 

    int health; 
    int magic; 

    public Baddie(int health, int magic){ 
     this.health = health; 
     this.magic = magic; 
    } 

    public int getHealth(){ 
     return health; 
    } 

现在,回答我的问题可能是“没有区别”,这就是罚款与我..我只是想知道。使用现场访问获取Baddie健康状况的速度更快吗:

//Somewhere in the main thread, I get an instance of Baddie.. 
Baddie b = getScaryBadGuy(); 
int baddieHealth = b.health; 

还是使用返回方法更快?

int baddieHealth = b.getHealth(); 

回答

5

复制和粘贴从Designing for Performance

避免内部getter/setter方法

在像C++是 常见的做法是用干将本地语言(例如我 = getCount())而不是直接访问字段(i = mCount)。这是 C++的一个很好的习惯,因为 编译器通常可以内嵌 的访问权限,如果需要限制或调试字段的访问,你可以随时添加 的代码。

在Android上,这是一个坏主意。 虚拟方法调用比较昂贵, 比实例字段 查找要多得多。遵循 通用面向对象编程 的做法是合理的,并且在公共接口中有获取者和设置者 ,但在 类中,您应该始终直接访问 字段。

没有JIT,直接字段访问是 约比调用 平凡的getter快3倍。通过JIT(其中 直接字段访问与访问本地的便宜,如 一样),直接字段 访问比调用平凡的获取器的约快7倍。在Froyo中,这是 为真,但当JIT内联吸气 方法时,未来会改进 。

+0

哦!我以为我读得很透彻..不要猜测!感谢你的回答! – Snailer 2010-11-01 17:51:24

0

如果可以的话,编译器会进行优化。这是过早优化的一个完美例子。在代码中使用任何有意义的东西。不要担心“储蓄周期”。 2-3个周期可能会或可能不会节省超过任何其他操作所需的数百万个周期。

+0

虽然答案说使用字段访问,但我相信你也是对的。我想,这是一个微不足道的问题。这不像现在手机无法处理的几种方法:P我会尽量不要担心优化。 – Snailer 2010-11-01 17:53:54

0

海事组织这是一个比优化问题更多的设计问题。我建议不要编写/生成任何getter或setter,除非你真的需要从课堂外访问它们。这趋于保持尽可能低的耦合。

或者让这些getters/setters默认为私有会有相同的结果,但它更多的代码没有真正的好处。

1

表现总是相对的。以百分比或因素来考虑通常会更好。如果某些事情需要一微秒,那可能是很多,也可能没有。这取决于您需要每秒执行多少次。这是不成熟的优化被忽视的主要原因,它是在不知道是否存在问题的情况下完成的。