次の 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 の違いを見てください。下を参照してください。これは、バージョンを超えた VM の更新/改善によるものですか? それともそれ以上のものがありますか?
- これは、このようなものをテストするための最良の方法ですか?
---結果 Mac OS X ---
JavaVM ホットスポット 1.6.0
Not Equals 演算子の Avr: 1937
Equals "false" 演算子の Avr: 1937
Not Operator の Avr: 1941
JavaVM ホットスポット 1.5.0
Not Equals 演算子の Avr: 5023
Equals "false" 演算子の Avr: 5035
Not Operator の Avr: 5067
JavaVM ホットスポット 1.4.2
Not Equals 演算子の Avr: 3993
Equals "false" 演算子の Avr: 4015
Not Operator の Avr: 4009
JavaVM ホットスポット 1.4.0
Not Equals 演算子の Avr: 3961
Equals "false" 演算子の Avr: 3960
Not Operator の Avr: 3961
ありがとう。