我该从何说起?下面是一些最该知道的东西。我在一个循环里写了一个计时功能,用来报告每秒钟千次迭代速度(K/sec)和每次迭代所需微秒数(uSecs)。整个测试在Sparc 20上完成,JDK版本为1.1.4,编译器为JIT。随后我注意到了如下信息:
这些实验是在1998年完成的。编译器已经有所变化了。
递减计数要比递增计数快两倍:我的机器可以在一秒钟内递减计数1.44亿次,但递增计数只能完成7200万次。
调用Math.max(a,b)要比(a > b) ? a : b慢七倍,这是由于函数调用引起的。
数组要比Vectors快15到30倍。Hashtable要比Vector快2/3倍。
Bitset.get(i)要比bits & 1 << i慢60倍。这大部分时候是因为函数的同步调用造成的。当然,如果超过了64位,这个测试可能就不准了。
Java编译器在循环中能检测出常量这件事做得并不好。C/Java的for循环是个比较糟糕的概念,因为它大部分时候会重复计算结束条件。比如,for(int i=0; i<str.length(); i++) 要比int len = str.length(); for(int i=0; i<len; i++)慢三倍。
|