Đây là điểm chuẩn vi mô trong trường hợp dài. Trên máy tính xách tay của tôi (2.8GHz), sử dụng shift thay vì Math.pow
nhanh hơn 7 lần.
int limit = 50_000_000;
@Test
public void testPower() {
Random r = new Random(7);
long t = System.currentTimeMillis();
for (int i = 0; i < limit; i++) {
int p = r.nextInt(63);
long l = (long)Math.pow(2,p);
}
long t1 = System.currentTimeMillis();
System.out.println((t1-t)/1000.0); // 3.758 s
}
@Test
public void testShift() {
Random r = new Random(7);
long t = System.currentTimeMillis();
for (int i = 0; i < limit; i++) {
int p = r.nextInt(63);
long l = 1L << p;
}
long t1 = System.currentTimeMillis();
System.out.println((t1-t)/1000.0); // 0.523 s
}
Sự khác biệt tinh tế là pow() là ** nhiều ** chậm hơn ngay cả khi câu trả lời giống nhau. pow() có lỗi làm tròn, trong khi 'int' có tràn. Bạn có thể thử '1L << 32' bằng' 2147483648' –