2010-07-09 31 views
11

Tôi nghe từ một nhà phát triển khác rằng một đối tượng quá đắt để lặp lại nhiều lần vì "nó có một loạt các phương thức".Có chi phí cho mỗi phương thức để phản ánh sự kiện trong Java không?

Sự hiểu biết của tôi (từ Bloch, chủ yếu) là việc tạo đối tượng tốn kém chủ yếu thông qua những thứ được thực hiện một cách rõ ràng trong hàm tạo, đặc biệt là tạo các đối tượng đắt tiền khác.

Có chi phí mỗi phương thức cho một đối tượng mới trong Java không? Tôi đang nghĩ không, nhưng tôi cần tài liệu tham khảo nếu có ai có chúng.

Cảm ơn!

+3

Tôi khuyên bạn nên tạo một lớp không có phương pháp và lớp khác có 100 phương pháp, sau đó định thời gian cần thiết để khởi tạo từng lớp một triệu lần. Sau đó, làm điều đó một vài lần nữa để đảm bảo. (Phản ứng đầu gối của tôi sẽ là không, phương pháp không tạo ra sự khác biệt. Nhưng đừng nói lời của tôi cho nó.) –

+0

Tôi cần tạo ra một số người thử nghiệm thời gian cho loại điều này. Có bất kỳ đã ra khỏi đó? Một câu hỏi SO khác .... – orbfish

Trả lời

11

Nhiều phương pháp có nghĩa là lớn virtual method table (VMT). Tuy nhiên, VMT là mỗi lớp giống như siêu dữ liệu và do đó chỉ có tối đa chi phí một lần cho lần khởi tạo đầu tiên. Các instantiations tiếp theo chỉ nhanh như các đối tượng có ít phương thức hơn, giả sử rằng các hàm khởi tạo không làm việc nâng hạng nặng.

Giá trị đọc cũng là chương trên object creation from the performance tuning book.

+2

* "... chỉ có tối đa chi phí một lần cho lần khởi đầu đầu tiên" *. Trên thực tế, chi phí phát sinh tại thời gian tải lớp. –

+0

Cảm ơn câu trả lời. Cuốn sách trông hơi lạc hậu, nhưng tôi đang xem. – orbfish

+0

@Stephen C, có thể phụ thuộc vào VM được sử dụng và cách JIT hoạt động. Đó là lý do tại sao tôi đã viết "nhiều nhất" - nó có thể lười biếng tải các lớp học, và lớp học có thể được tải khá muộn, về cơ bản được kích hoạt bởi sự khởi đầu của họ. – Lucero

3

Không, không có mối quan hệ nào giữa số phương thức trên lớp và thời gian cho JVM thực hiện thao tác new.

Nghiêm túc, nếu bạn đang suy nghĩ ở cấp độ này, bạn không nên sử dụng một ngôn ngữ như Java, hãy đi và viết ứng dụng của bạn trong trình biên dịch hoặc 'C'.

Sự thật là bạn nên tập trung vào thiết kế các thuật toán và cấu trúc dữ liệu của bạn, chúng sẽ có ảnh hưởng sâu sắc hơn đến hiệu suất ứng dụng của bạn hơn bất kỳ tối ưu hóa vi mô tiềm năng nào.

+2

+1 để làm nổi bật rằng nếu bạn nghĩ rằng hiệu suất tạo đối tượng là một vấn đề bạn không nên sử dụng java ... –

+3

Nếu bạn đọc kỹ câu hỏi của tôi, bạn sẽ thấy rằng tôi không phải là người "suy nghĩ ở cấp độ này" - Tôi đang cố gắng để tạo ra một thiết kế tốt, nhưng đang chạy vào kháng chiến dựa trên tuyên bố vô căn cứ. Xúc phạm không được đánh giá cao. – orbfish

+1

@inflagranti FYI có một chương đầy đủ về nó trong cuốn sách được tham chiếu trước đó, và cũng có trong Java hiệu quả. Tôi sẽ để bạn nói với các tác giả rằng họ không nên sử dụng Java;) – orbfish

1

Như một sang một bên, sẽ có một hit hiệu suất nhỏ cho một lớp với nhiều biến mẫu (không chắc chắn nó sẽ thực sự có thể đo lường được). Java yêu cầu mỗi biến mẫu được đặt thành 0, false, null cho mỗi cá thể mới và có một chi phí thời gian chạy liên quan đến việc đặt chúng thành 0. Tuy nhiên nó có lẽ chỉ là một memset (hoặc calloc hoặc một cái gì đó như thế) mà là nhanh chóng để hoàn thành.

0

Tôi cần tham khảo nếu có ai có.

Tôi đề nghị rằng đó là khác phát triển ai sẽ được yêu cầu để tham khảo để hỗ trợ tuyên bố lố bịch của mình.

+0

Tôi mới bắt đầu ở đây. Có lẽ trong thời gian .... – orbfish

+1

Chỉ cần chơi câm. Nói 'Thật sao? Nó nói ở đâu? Làm thế nào mà có thể làm việc? Tại sao một phương pháp bổ sung sẽ tốn nhiều thời gian hơn vào thời điểm instantiation đối tượng? ' – EJP

Các vấn đề liên quan