Luật tối ưu hóa đầu tiên: không làm điều đó. Luật thứ hai: không làm điều đó trừ khi bạn thực sự đã đo lường và biết thực tế là bạn cần tối ưu hóa và ở đâu.
Chỉ khi các đối tượng thực sự đắt tiền để tạo và nếu chúng thực sự có thể được sử dụng lại (bạn có thể đặt lại trạng thái chỉ với các hoạt động công khai thành thứ có thể được sử dụng lại).
Hai lợi ích bạn đề cập không thực sự đúng: phân bổ bộ nhớ trong java là miễn phí (chi phí gần 10 hướng dẫn cpu, không có gì). Vì vậy, giảm việc tạo ra các đối tượng chỉ giúp bạn tiết kiệm thời gian dành cho hàm tạo. Điều này có thể đạt được với các đối tượng thực sự nặng có thể được tái sử dụng (kết nối cơ sở dữ liệu, chủ đề) mà không thay đổi: bạn sử dụng lại kết nối cùng một kết nối, cùng một chuỗi.
Thời gian GC không giảm. Trong thực tế nó có thể tồi tệ hơn. Với việc di chuyển các thế hệ GC (Java là, hoặc lên đến 1.5) chi phí của một lần chạy GC được xác định bởi số lượng các đối tượng còn sống, không phải bởi bộ nhớ được giải phóng.Các đối tượng sống sẽ được chuyển đến một không gian khác trong bộ nhớ (đây là điều làm cho việc phân bổ bộ nhớ quá nhanh: bộ nhớ tự do tiếp giáp trong mỗi khối GC) vài lần trước khi được đánh dấu là cũ và chuyển vào không gian bộ nhớ thế hệ cũ hơn.
Ngôn ngữ lập trình và hỗ trợ, như GC, được thiết kế để ghi nhớ cách sử dụng phổ biến. Nếu bạn tránh xa việc sử dụng phổ biến trong nhiều trường hợp, bạn có thể sẽ gặp khó khăn hơn khi đọc mã hiệu quả hơn.
Nguồn
2009-03-25 07:36:33
Các ý kiến có vẻ tiêu cực, nhưng tôi đang xem xét một cái gì đó tương tự. Tôi có một ứng dụng j2me tạo ra hàng nghìn đối tượng hộp giới hạn tiềm ẩn. Nếu tôi có thể tạo ra một hồ bơi của họ sau đó tôi sẽ cho GC một công việc dễ dàng hơn sau này. Tôi tự hỏi nếu điều này vẫn còn là một ý tưởng tồi trong thế giới hạn chế của điện thoại di động. – izb
Chỉ có đối tượng đắt tiền trong hồ bơi (như kết nối cơ sở dữ liệu và như vậy). Định nghĩa "đắt tiền" phụ thuộc rất nhiều vào yêu cầu của bạn. –