2010-08-04 28 views
5

Trong C#, sẽ có bất kỳ sự khác biệt nào về hiệu suất khi so sánh BA lựa chọn thay thế sau đây không?sẽ khai báo các biến bên trong các khối con cải thiện hiệu suất?

ONE

void ONE(int x) { 

if (x == 10) 
{ 
    int y = 20; 
    int z = 30; 
    // do other stuff 
} else { 
    // do other stuff 
} 
} 

HAI

void TWO(int x) { 

int y; 
int z; 

if (x == 10) 
{ 
    y = 20; 
    z = 30; 
    // do other stuff 
} else { 
    // do other stuff 
} 
} 

BA

void THREE(int x) { 

int y = 20; 
int z = 30; 

if (x == 10) 
{ 
    // do other stuff 
} else { 
    // do other stuff 
} 
} 
+3

No.bạn đang lo lắng về những gì được gọi là 'tối ưu hóa vi mô': bạn có đo điểm chuẩn để xác định rằng bạn thực sự có vấn đề về hiệu suất không? –

+0

@Mitch: Tôi thấy không có nơi nào trong bài đăng của Craig phàn nàn về việc có hiệu suất chậm trong mã của anh ấy. Anh ta có một câu hỏi hoàn toàn hợp lệ và thông minh để hỏi, và thế là anh ta đã làm được. Nó giống như chúng tôi không thể đăng bất cứ điều gì @SO liên quan đến hiệu suất. –

+2

Tôi thậm chí sẽ không gọi đây là tối ưu hóa vi mô, mà là tối ưu hóa nano. Bất cứ ai nhìn thấy đầu ra của một profiler biết rằng lo lắng về thời gian thực hiện để lưu trữ một biến hoặc gọi một hàm là ludicrously không đáng kể. –

Trả lời

4

Tất cả các khác là như nhau (và họ thường không, đó là lý do tại sao bạn thường phải thực sự kiểm tra nó), ONE()TWO() nên tạo các hướng dẫn IL cùng kể từ biến địa phương kết thúc scoped đến toàn bộ phương pháp. THREE() sẽ là không thể bỏ qua chậm hơn nếu x==10 vì hai thiết bị kia sẽ không bận tâm lưu trữ các giá trị trong các biến cục bộ.

Cả ba đều chiếm cùng một lượng bộ nhớ — bộ nhớ cho tất cả các biến được phân bổ ngay cả khi không có gì được lưu trữ trong chúng. Trình biên dịch JIT có thể thực hiện một tối ưu hóa ở đây, mặc dù, nếu nó bao giờ tìm kiếm các biến không sử dụng.

+0

+1 cho ONE và HAI tạo cùng một IL. Mức độ phạm vi của phương thức trong C#/CLR là một thuật toán lén lút, đặc biệt đối với các lập trình viên C++. –

+0

trình biên dịch sẽ phân bổ bộ nhớ trong tùy chọn ONE khi x! = 10? – CJ7

+0

@Craig, có nó sẽ — vì không có cách nào để biết nếu x! = 10 cho đến khi nó thực sự được đánh giá sau khi cuộc gọi chức năng đã được thiết lập (bao gồm phân bổ bộ nhớ cho các biến). –

1

Không có sự khác biệt hiệu suất, nhưng bạn đang đi ing để tìm các vấn đề phạm vi biến giữa mỗi ví dụ.

Bạn cũng đang hiển thị ba ý đồ khác nhau giữa những ví dụ, mà không phải là những gì bạn muốn:

  1. y và z được giới hạn phạm vi của câu lệnh if.

  2. y và z được sử dụng bên ngoài câu lệnh if, nhưng được đặt theo điều kiện.

  3. y và z không liên quan gì đến câu lệnh if.

+0

tại sao không có sự khác biệt về hiệu suất? – CJ7

0

Tôi không nghĩ rằng nó sẽ tạo ra nhiều sự khác biệt. Thời gian duy nhất bạn sẽ cần phải lo lắng là nếu tạo đối tượng mới và khởi tạo nó là tốn kém. Bạn luôn có thể cố gắng để hồ sơ mỗi phương pháp một vài nghìn lần để xem nếu có bất kỳ sự khác biệt nhưng tôi nghi ngờ bạn sẽ tìm thấy bất kỳ.

Lần duy nhất tôi di chuyển một tuyên bố xa hơn nơi nó được sử dụng là nếu nó sẽ được làm việc trong một vòng lặp. ví dụ:

void RunMethod() { 
    FormRepresentation formRep = null; 
    for (int idx = 0; idx < 10; idx++) { 
    formRep = new FormRepresentation(); 
    // do something 
    } 
} 

Nó thực sự không tạo ra bất kỳ sự khác biệt nào vì đối tượng vẫn đang được tạo nhưng đối với tôi, nó trông sạch hơn. Một thứ khác bạn cần xem xét là phạm vi của biến. Không thể sử dụng các biến được khai báo ngoài phạm vi mà chúng được khai báo.

1

Tất nhiên, bạn nên luôn luôn chọn MỘT, nó dễ đọc hơn nhiều. Rằng nó nhanh hơn một phần nhỏ của một nano giây không phải là một tai nạn, có thể đọc được mã thường xuyên.

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