JAVA的编译器首先把JAVA源文件编译为字节码。这些字节码对于JAVA虚拟机(JVM)来讲就是机器的指令码。然后,JAVA的解释器不断的循环取出字节码进行解释并执行。
这样做的优点是可以实现JAVA语言的跨平台,同时生成的字节码也比较紧凑。JAVA的一些优点,如安全性,动态性都得保持;但缺点是省生成的字节码没有经过什么优化,同全部编译好的本地码相比,速度比较慢。
b) 及时编译技术(Just In Time)
及时编译技术是为了解决指令解释技术效率比较低,速度比较慢的情况下提出的,其结构图如下所示。
其主要变化是在JAVA程序执行之前,又JIT编译器把JAVA的字节码编译为机器码。从而在程序运行时直接执行机器码,而不用对字节码进行解释。同时对代码也进行了部分的优化。
这样做的优点是大大提高了JAVA程序的性能。同时,由于编译的结果并不在程序运行间保存,因此也节约了存储空间了加载程序的时间;缺点是由于JIT编译器对所有的代码都想优化,因此也浪费了很多的时间。
IBM和SUN公司都提供了相关的JIT产品。
c) 适应性优化技术(Adaptive Optimization Technology)
同JIT技术相比,适应性优化技术并不对所有的字节码进行优化。它会跟踪程序运行的成个过程,从而发现需要优化的代码,对代码进行动态的优化。对优化的代码,采取80/20的策略。从理论上讲,程序运行的时间越长,代码就越优化。其结构图如下:
其优点是适应性优化技术充分利用了程序执行时的信息,发行程序的性能瓶颈,从而提高程序的性能;其缺点是在进行优化时可能会选择不当,发而降低了程序的性能。
其主要产品又IBM,SUN的HotSpot.
d) 动态优化,提前编译为机器码的技术(Dynamic Optimization,Ahead Of Time)
动态优化技术充分利用了JAVA源码编译,字节码编译,动态编译和静态编译的技术。其输入时JAVA的原码或字节码,而输出是经过高度优化的可执行代码和个来动态库的混合(Window中是DLL文件,UNIX中是共享库.a .so文件)。其结构如下:
return value;
}
发现没有,前面的if..else if完全可以作为最后一个else来操作,但是为什么,因为可能要多执行一次replace递归调用,这是从validator源码里面看见的,在来一段:
if (log.isDebugEnabled()) {
log.debug(" Looking for Action instance for class " + className);
}
为 什么还要判断是不是debug,不是假如配置成debug以上的,debug信息也不会输出吗,但是,记住,信息是不会输出,但是" Looking for Action instance for class " + className这条语句总要执行吧,就一个简单的boolean判断,就可以减少字符串相加的运算。
/*
* Created on 2004-12-17
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package temp;
/**
* @author xinli
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class Test {
public static void main(String[] args) {
Test test=new Test();
A a=new B();
B b=(B)a;
test.a(b);
test.a(a);
C c=new D();
D d=(D)c;
test.c(c);
test.c(d);
}
public void a(A a){
System.out.println("a(A)");
}
public void a(B b){
System.out.println("a(B)");
}
public void c(C c){
System.out.println("c(C)");
}
public void c(D d){
System.out.println("c(D)");
}
}
class A{