2011-11-15 45 views
6

Một hàm tạo tĩnh được thực hiện lần đầu tiên bạn truy cập một thành viên tĩnh. Biết điều này, tôi có một số câu hỏi:Nhà xây dựng tĩnh có thể giảm hiệu năng truy cập các phương pháp tĩnh không?

  • Điều này có nghĩa là mỗi lần tôi truy cập phương pháp tĩnh, thời gian chạy phải kiểm tra xem hàm tạo tĩnh đã được gọi chưa?
  • Điều này có ảnh hưởng đến hiệu suất không?
  • Các lớp tĩnh "xây dựng ít" có tránh được hiệu suất này không?

[EDIT]: Tôi muốn làm rõ rằng tôi KHÔNG quan tâm đến tối ưu hóa vi mô.
Tôi đang đặt câu hỏi này bởi vì đó là quyết định thiết kế. Nếu một nhà xây dựng tĩnh phát sinh một lần truy cập hiệu suất, thì tôi sẽ thiết kế mã của tôi với ý nghĩ đó và sẽ ý thức hơn về các quyết định có thể ảnh hưởng đến hiệu suất.

Dưới đây là ví dụ minh họa câu hỏi của tôi. Sẽ có lợi ích gì khi sử dụng phương pháp Independent và đặt nó vào một lớp tĩnh riêng biệt? Bằng cách đó, nó sẽ không phải kiểm tra xem tĩnh Test đã được khởi tạo hay chưa. [Cập nhật Xem câu trả lời của tôi bên dưới để biết ví dụ tốt hơn, đơn giản hơn].

static class Test { 
    // Static constructor with dependent method: 
    static int x; 
    static Test() { x = 5; } 
    static int Dependent() { return x; } 

    // Static, independent method: 
    static int Independent(int y) { return y+1; } 
} 

Here's the quote từ C# đặc điểm kỹ thuật về constructor tĩnh:

Việc thực hiện một constructor tĩnh được kích hoạt bởi các đầu tiên của sự kiện sau đây xảy ra trong một miền ứng dụng:

  • Một thể hiện của lớp được tạo ra.
  • Bất kỳ thành viên tĩnh nào trong lớp đều được tham chiếu.
+0

Có thể trùng lặp: http://stackoverflow.com/questions/2921828/static-constructors-cause-a-performance-over-head –

+0

Tôi đã đọc bài đăng đó, nhưng nó chắc chắn khác với câu hỏi của tôi. Nó so sánh hiệu suất của ** constructor ** ** ** khởi tạo tĩnh **. Tôi quan tâm đến việc biết nếu truy cập một phương thức bị chậm lại bởi một constructor tĩnh. Tôi đọc lại "trùng lặp", bao gồm tất cả các câu trả lời và liên kết, và vẫn không có câu trả lời cho câu hỏi của tôi! –

+0

Tôi nghĩ rằng đó là truy cập trường và không phải trên cuộc gọi phương thức. Nhưng có, có thể có một hiệu suất đáng chú ý giảm trong một số kịch bản. – CodesInChaos

Trả lời

7

Do thiếu câu trả lời và theo chỉ dẫn của @ Jobo, tôi đã quyết định tự mình thử nghiệm điều này.

Dưới đây là các lớp học thử nghiệm của tôi:

static class WithConstructor { 
    static WithConstructor(){ } 
    public static int Square(int x){ return x*x; } 
} 
static class NoConstructor { 
    public static int Square(int x){ return x*x; } 
} 

Biên soạn cho phát hành, sử dụng .NET 4.0, kết quả là rất phù hợp:

 
╔═════════════╦══════════════════╦═════════╦═══════════════╗ 
║ Iterations: ║ With Constructor ║ 4513 ms ║ Improvement: ║ 
║ 1000000000 ║ No Constructor ║ 3072 ms ║ 33%   ║ 
╚═════════════╩══════════════════╩═════════╩═══════════════╝ 

Vì vậy, tôi sẽ trả lời câu hỏi của riêng tôi:

  • Nếu một constructor tĩnh tồn tại, sau đó là một phương pháp tĩnh sẽ phải chịu một (vi) hiệu suất trúng, vì cờ beforefieldinit phải luôn được kiểm tra.

  • Nếu một hàm tạo tĩnh không tồn tại, thì phương thức sẽ không phát sinh hiệu suất.

2

Tại sao bạn không tự mình thử nghiệm?

Gọi phương thức Độc lập của bạn một số lần như được chỉ định ở trên. Sau đó tạo một lớp tĩnh riêng với cùng một phương thức và gọi nó cùng một số lần.

Sử dụng http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx để đo.

Tôi đoán sẽ là nó won't vấn đề ...

Bạn cũng có thể viết một cái gì đó để an ủi trong Constructor tĩnh của bạn để kiểm tra xem đã được gọi. Tìm ra cho chính mình sẽ kéo dài hơn một số câu trả lời theroetical, chỉ cần 2 xu của tôi.

+0

Tôi nghĩ rằng tôi sẽ. Tôi thực sự ngạc nhiên khi không có câu trả lời nổi tiếng. –

+0

@Scott không có câu trả lời nổi tiếng vì điều này rất có thể không phải là một nút cổ chai cho bất kỳ ai. Thậm chí còn có cơ hội loại bỏ hàm khởi tạo đó và thay vào đó mặc định giá trị của X thành 5. – Rangoric

+0

@Rangoric Tôi đã không đề cập đến điều này trong OP của tôi (nó ở trong đó bây giờ), nhưng tôi không quan tâm đến hiệu suất như tôi trong các quyết định thiết kế. Khi thiết kế một phương pháp tĩnh, nó chắc chắn sẽ giúp hiểu được các lần truy cập hiệu suất có thể, và trong trường hợp này, việc có một mẫu thiết kế tốt sẽ giúp tránh được các lần truy cập này. –

0

Trình tạo tĩnh có thể làm giảm hiệu suất của trình gọi phương thức đầu tiên. Indead, người gọi đầu tiên được thay đổi để kiểm tra nếu constructor tĩnh đã được gọi nhưng người gọi khác nếu không bị ảnh hưởng.

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