理论教育 实战技巧优化代码的过程介绍

实战技巧优化代码的过程介绍

时间:2023-06-19 理论教育 版权反馈
【摘要】:虽然如此,下面的演示代码还是给出了一个可以接受的增强型for循环的例子。函数two():使用Java语言的1.5版本中的for循环语句,编译产生的源代码考虑到了复制数组的引用和数组的长度到本地变量,是遍历数组比较好的方法,它在主循环中确实产生了一个额外的载入和储存过程。由此可以得到,增强的for循环在数组里面表现地很好,但是当和Iterable对象一起使用时要谨慎,因为这里多了一个对象的创建。

实战技巧优化代码的过程介绍

(1)慎重使用增强型for循环语句

增强型for循环也就是我们常说的“for-each循环”,经常用于iterable接口的继承收集接口上面。在这些对象里面,一个iterator被分配给对象去调用它的hasNext()和next()方法。虽然如此,下面的演示代码还是给出了一个可以接受的增强型for循环的例子。

对上述代码的具体说明如下:

函数zero():在每一次的循环中重新得到静态属性两次,获得数组长度一次。

函数one():把所有的东西都变为本地变量,避免类查找属性调用。

函数two():使用Java语言的1.5版本中的for循环语句,编译产生的源代码考虑到了复制数组的引用和数组的长度到本地变量,是遍历数组比较好的方法,它在主循环中确实产生了一个额外的载入和储存过程(显然保存了“a”)。和函数one()相比,函数two()的速度确实有一点减慢,并且额外增加了4字节。

由此可以得到,增强的for循环在数组里面表现地很好,但是当和Iterable对象一起使用时要谨慎,因为这里多了一个对象的创建。

(2)通过内联类使用包空间

请看在如下代码中对类的声明:

在上述代码中,需要注意我们定义了一个内联类,它调用了外部类的私有方法和私有属性。这是一个合法的调用,代码应该会显示:(www.daowen.com)

但是问题是,Foo$Inner在理论上(后台运行上)应该是一个完全独立的类,它违规的调用了Foo的私有成员。为了弥补这个缺陷,编译器产生了一对合成的方法:

这样当内联类需要从外部访问mValue和调用doStuff时,内联类就会调用这些静态的方法,这说明我们不是直接访问类成员,而是通过公共的方法来访问的。前面曾经提到过间接访问要比直接访问慢,因此这是一个按语言习惯执行的例子。

如果让拥有包空间的内联类直接声明需要访问的属性和方法,我们就可以避免这个问题。但是不幸的是,它同时也意味着该属性也能够被相同包下面的其他的类直接访问,这违反了标准的面向对象的使所有属性私有的原则。同样,如果是设计公共的API你就要仔细的考虑这种优化的用法。

(3)避免浮点类型的使用

在奔腾CPU发布之前,游戏程序员都尽可能地使用Integer类型的数学函数,这是很正常的。因为在奔腾处理器里面,浮点数的处理为它一个突出特点,并且浮点数与整数的交互使用相比单独使用整数来说,前者会使游戏程序运行的更快,一般的在桌面计算机上面我们可以自由的使用浮点数。

但是不幸的是,嵌入式的处理器通常并不支持浮点数的处理,因此所有的“float”和“double”操作都是通过软件进行的,一些基本的浮点数的操作就需要花费毫秒级的时间。并且即使是整数,一些芯片也只有乘法而没有除法。在这些情况下,整数的除法和取模操作都是通过软件实现。当你创建一个Hash表或者进行大量的数学运算时,这都是你要考虑的。

(4)避免在条件判定语句中重复调用函数

请读者看下面的演示代码:

应该写成下面的形式,因为这样可以减小时间开销。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈