当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:12:00  来源:本站整理

<b>诊断Java代码: 提高Java代码的性能</b>[Java编程]

赞助商链接



  本文“<b>诊断Java代码: 提高Java代码的性能</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

很多算法用尾递归办法表示会显得分外简明.编译器会自动把这种办法转换成循环,以提高程序的性能.但在 Java 语言标准中,并没有要求一定要作这种转换,因此,并非全部的 Java 虚拟机(JVM)城市做这种转换.这就意味着在 Java 语言中采取尾递归办法将招致宏大的内存占用,而这并非我们盼望的后果.Eric Allen 在本文中阐述了动态编译将会保持语言的语义,而静态编译则普通不会.他阐明了为什么这是一个重要问题,并供应了一段代码来帮忙判断您的当即(JIT)编译器能否会在保持语言语义的同时做尾递归代码转换.

尾递归及其转换

相当多的程序包含有循环,这些循环运行的时间占了程序总运行时间的很大一部份.这些循环常常要反复更新不止一个变量,而每个变量的更新又常常依靠于别的变量的值.

假如把迭代当作是 尾递归函数,那么,便可以把这些变量当作是函数的参数.简单提醒一下:假如一个调用的返回值被作为调用函数的值当即返回,那么,这个递归调用就是尾递归;尾递归没必要记着调用时调用函数的上下文.

由于这一特点,在尾递归函数和循环之间有一个很好的对应关系:可以简单地把每个递归调用看做是一个循环的多次迭代.但因为全部可变的参数值都一次传给了递归调用,所以比起循环来,在尾递归中可以更简单地得到更新值.并且,难以利用的 break 语句也常常为函数的简单返回所替换.

但在 Java 编程中,用这种方法表示迭代将招致效率低下,因为大量的递归调用有招致仓库溢出的危险.

办理筹划对比简单:因为尾递归函数实际上只是编写循环的一种更简单的方法,所以就让编译器把它们自动转换成循环情势.这样您就同时操纵了这两种情势的长处.

但是,固然大家都熟知若何把一个尾递归函数自动转换成一个简单循环,Java 标准却不要求做这种转换.不作这种要求的缘由大约是:普通在面向对象的语言中,这种转换不能静态地举行.相反地,这种从尾递归函数到简单循环的转换必须由 JIT 编译器动态地举行.

要理解为什么会是这样,考虑下面一个失利的尝试:在 Integers 集上,把 Iterator 中的元素相乘.

因为下面的程序中有一个错误,所以在运行时会抛出一个非常.但是,就象在本专栏从前的很多文章中已经论证的那样,一个程序抛出的切确非常(跟很棒的错误范例标识符一样)关于找到错误藏在程序的什么地方并没有什么帮忙,我们也不想编译器以这种方法改变程序,以使编译的后果代码抛出一个差别的非常.

清单 1. 一个把 Integer 集的 Iterator 中的元素相乘的失利尝试

import java.util.Iterator;
public class Example {
  public int product(Iterator i) {
   return productHelp(i, 0);
  }
  int productHelp(Iterator i, int accumulator) {
   if (i.hasNext()) {
    return productHelp(i, accumulator * ((Integer)i.next()).intValue());
   }
   else {
    return accumulator;
   }
  }
}

注意 product 办法中的错误. product 办法通过把 accumulator 赋值为 0 调用 productHelp .它的值应为 1.不然,在类 Example 的任何实例上调用 product 都将产生 0 值,不管 Iterator 是什么值.

假定这个错误终于被改正了,但同时,类 Example 的一个子类也被成立了,如清单 2 所示:


  以上是“<b>诊断Java代码: 提高Java代码的性能</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .