Thực hiện đó đảm bảo tính đúng đắn như tràn không còn có thể xảy ra. Tuy nhiên, nó không phải là không có vấn đề bởi vì, một lần nữa, nó là khá chậm: một cuộc gọi đến computeIterativelyFasterUsingBigInteger(50000) mất khoảng 1,3 giây để hoàn thành. Hiệu suất lackluster có thể được giải thích bởi ba điều: BigInteger là không thay đổi. BigInteger được thực hiện bằng cách sử dụng BigInt và mã nguồn gốc. Lớn hơn những con số, còn phải mất thêm chúng với nhau. Kể từ khi BigInteger là không thay đổi, chúng tôi đã viết "một = a.add(b)" thay vì chỉ đơn giản là "a.add(b)". Nhiều người sẽ cho rằng "a.add(b)" là tương đương với "a = b" và nhiều người sẽ là sai lầm: nó là thực sự tương đương của "một + b". Vì vậy, chúng tôi đã viết "một = a.add(b)" để chỉ định kết quả. Chi tiết nhỏ là rất quan trọng vì "a.add(b)" tạo ra một đối tượng BigInteger mới mà giữ kết quả của việc bổ sung. Bởi vì việc thực hiện nội bộ hiện tại của BigInteger, một đối tượng BigInt bổ sung được tạo cho mỗi đối tượng BigInteger được phân bổ. Điều này dẫn đến hai lần như nhiều đối tượng được phân bổ trong thực hiện computeIterativelyFasterUsingBigInteger: khoảng 100.000 đối tượng được tạo ra khi gọi computeIterativelyFasterUsingBigInteger (50000) (và tất cả chúng nhưng sẽ trở thành có sẵn cho bộ sưu tập rác gần như ngay lập tức). Ngoài ra, BigInt được thực hiện bằng cách sử dụng mã nguồn gốc và mã nguồn gốc điện thoại từ Java (bằng cách sử dụng JNI) có một chi phí nhất định. Lý do thứ ba là số lượng rất lớn không phù hợp trong một giá trị duy nhất, dài 64-bit. Ví dụ, số Fibonacci 50,000th là 34,7111-bit dài.
đang được dịch, vui lòng đợi..