Tôi đã theo dõi sự thay đổi thành revision 318617 in the Apache Xerces SVN Repository (đây là dự án mà trình phân tích cú pháp XML này ban đầu được phát triển, như tên gói đề xuất).
Phần liên quan của thông điệp cam kết là:
Đang cố gắng để cải thiện việc sử dụng các bảng biểu tượng. Nhiều chuỗi được xác định trước là được thêm vào bảng biểu tượng mỗi lần trình phân tích cú pháp được đặt lại. Đối với các tài liệu nhỏ, đây sẽ là một chi phí đáng kể. Bây giờ, vì chúng ta gọi String # intern cho Strings trong bảng biểu tượng, nó đủ để sử dụng String # intern cho các ký hiệu được xác định trước là . Điều này chỉ cần được thực hiện một lần.
Như bạn đã lưu ý, không được cần thiết .intern()
(và sẽ không có hiệu lực rõ ràng) trên thực thi JVM phù hợp.
tôi đoán là
- hoặc tác giả đã không nhận thức được thực tế là xâu sẽ luôn luôn được thực tập nội trú
- hoặc nó là một quyết định có ý thức để tránh chống lại một thực hiện misbehaving JVM
Trong trường hợp thứ hai, tôi mong đợi một số lưu ý rằng trong nhận xét hoặc trong thông báo nhận xét, tuy nhiên.
Một hiệu ứng phụ của cuộc gọi .intern()
đó là các trình khởi tạo không còn là constant expressions và các trường khác sẽ không được các lớp khác tham chiếu. Điều đó sẽ đảm bảo rằng lớp học XMLScanner
được tải và trường được đọc. Tôi không nghĩ rằng điều này là có liên quan ở đây, tuy nhiên.
Nguồn
2012-11-02 14:24:15
+1 Câu hỏi hay! Hiệu ứng là như nhau, tuy nhiên bytecode được tạo ra có và không có khác nhau. Tôi đoán chúng tôi sẽ không bao giờ biết trừ khi chúng tôi yêu cầu trực tiếp với các tác giả vì vậy điều này không thể được trả lời. Tôi sẽ nói đây là tối ưu hóa sớm. – OscarRyz