请考虑以下java源:
package com.stackoverflow;
public class CondSpeed {
private static final long COUNT = 1000000000;
private static final long OUTER_COUNT = 15;
private static long notEqOperator = 0L;
private static long notOperator = 0L;
private static long equalsFalse = 0L;
public CondSpeed() {
super();
}
public static void main(String[] args) {
for(int outCount = 0;outCount < OUTER_COUNT;outCount++){
notEqOperator += testNotEaualsOperator();
equalsFalse += testEqualFalse();
notOperator += testNotOperator();
}
long avrForNotEqOperator = (notEqOperator / OUTER_COUNT);
long avrForEqualsFalse = (equalsFalse / OUTER_COUNT);
long avrForNotOperator = (notOperator / OUTER_COUNT);
System.out.println("Avr for Not Equals Operator: "+avrForNotEqOperator);
System.out.println("Avr for Equals \"false\" Operator: "+avrForEqualsFalse);
System.out.println("Avr for Not Operator: "+avrForNotOperator);
}
private static long testEqualFalse(){
long now = System.currentTimeMillis();
for(long i = 0;i < COUNT;i++){
boolean truFalse = returnTrueOrFalse();
if(truFalse == false){
//do nothing...
}
}
return (System.currentTimeMillis() - now);
}
private static long testNotOperator(){
long now = System.currentTimeMillis();
for(long i = 0;i < COUNT;i++){
boolean truFalse = returnTrueOrFalse();
if(!truFalse){
//do nothing...
}
}
return (System.currentTimeMillis() - now);
}
private static long testNotEaualsOperator(){
long now = System.currentTimeMillis();
for(long i = 0;i < COUNT;i++){
boolean truFalse = returnTrueOrFalse();
if(truFalse != true){
//do nothing...
}
}
return (System.currentTimeMillis() - now);
}
private static boolean isFalse;
private static boolean returnTrueOrFalse(){
if(isFalse){
isFalse = false;
}
else{
isFalse = true;
}
return isFalse;
}
}
如您所见,这是针对 3 个版本的if(false)条件的测试。
- 我对为什么结果首先在各种条件语句中不同感兴趣。((我知道这显然是编译器将 .java 解释为字节码的方式。))还有比这更多的吗?
- 第二。查看不同 Hotspot VM 的差异。见底部。这是因为更新/改进了虚拟机的版本吗?或者还有更多?
- 这是测试这样的东西的最好方法吗?
---结果 Mac OS X---
JavaVM 热点 1.6.0
不等于运算符的 Avr:1937
等于“假”运算符的 Avr:1937
非运算符的 Avr:1941
JavaVM 热点 1.5.0
不等于运算符的 Avr:5023
等于“假”运算符的 Avr:5035
非运算符的 Avr:5067
JavaVM 热点 1.4.2
不等于运算符的 Avr:3993
等于“假”运算符的 Avr:4015
非运算符的 Avr:4009
JavaVM 热点 1.4.0
不等于运算符的 Avr:3961
等于“假”运算符的 Avr:3960
非运算符的 Avr:3961
谢谢。