เมื่อเร็ว ๆ นี้ฉันสังเกตเห็นว่าการประกาศอาร์เรย์ที่มี 64 องค์ประกอบนั้นเร็วกว่ามาก (> 1,000 เท่า) กว่าการประกาศอาร์เรย์ประเภทเดียวกันที่มี 65 องค์ประกอบ
นี่คือรหัสที่ฉันใช้ทดสอบสิ่งนี้:
public class Tests{
public static void main(String args[]){
double start = System.nanoTime();
int job = 100000000;//100 million
for(int i = 0; i < job; i++){
double[] test = new double[64];
}
double end = System.nanoTime();
System.out.println("Total runtime = " + (end-start)/1000000 + " ms");
}
}
สิ่งนี้จะทำงานในเวลาประมาณ 6 มิลลิวินาทีหากฉันแทนที่new double[64]ด้วยnew double[65]จะใช้เวลาประมาณ 7 วินาที ปัญหานี้จะรุนแรงขึ้นอย่างทวีคูณหากงานกระจายไปทั่วเธรดมากขึ้นเรื่อย ๆ ซึ่งเป็นที่มาของปัญหาของฉัน
ปัญหานี้ยังเกิดขึ้นกับชนิดของอาร์เรย์เช่นหรือint[65] String[65]ปัญหานี้ไม่เกิดขึ้นกับสตริงขนาดใหญ่: String test = "many characters";แต่จะเริ่มเกิดขึ้นเมื่อสิ่งนี้ถูกเปลี่ยนเป็นString test = i + "";
ฉันสงสัยว่าเหตุใดจึงเป็นเช่นนั้นและหากเป็นไปได้ที่จะหลีกเลี่ยงปัญหานี้
System.nanoTime()ควรเป็นที่ต้องการมากกว่าSystem.currentTimeMillis()สำหรับการเปรียบเทียบ