2009-07-14 32 views
5

Trong câu lệnh PHP switch, có đặt các trường hợp phổ biến hơn ở gần đầu cải thiện hiệu suất không?Thứ tự các vụ việc có quan trọng trong câu lệnh chuyển đổi PHP không?

Ví dụ, nói hàm sau được gọi là 1000 lần:

<?php 
function foo_user ($op) { 
    switch ($op) { 
     case 'after_update': 
     //Some Stuff 
     case 'login': 
     //Some other Stuff 
    } 
} 

Nếu trong 990 của 1000 của thời đại các chức năng được gọi là tham số $ op là 'đăng nhập', hiệu suất sẽ cải thiện bằng cách case: 'login' phía trên case 'after_update': trong tuyên bố switch? Ví dụ: mã sau case 'after_update': có bị bỏ qua nếu $op = login được chuyển không?

Tôi đã chạy một số thử nghiệm không chính thức về ý tưởng này, nhưng sự khác biệt là không đáng kể - có lẽ vì mã sau case: 'login'case 'after_update': đều không quan trọng. Tôi muốn tránh thiết lập một thử nghiệm rộng rãi hơn với các hoạt động không tầm thường nếu ai đó biết câu trả lời hoàn toàn.

Điều này đặc biệt là một câu hỏi Drupal, nhưng tôi tưởng tượng nó có thể được giải quyết bởi bất kỳ ai quen thuộc với việc tối ưu hóa PHP.

Trả lời

10

Điều này có thể sẽ được gọi là tối ưu hóa vi mô. Tôi không tin rằng sẽ có một sự khác biệt lớn.

Tuy nhiên, trật tự không có ý nghĩa với logic của vụ án chuyển đổi nếu bạn cho phép các trường hợp rơi qua, ví dụ

switch ($var) { 

    case 0: 
    case 1: 
     do_it(); 
     break; 
    case 2: 
     do_it_else(); 
     break; 

} 

Trình tự là rất quan trọng, trường hợp sẽ rơi qua và thực hiện bất kỳ mã cho đến khi nó đập vỡ.

Tôi sẽ không lo ngại về tốc độ của vỏ chuyển đổi, trừ khi bạn đã nói 100 trường hợp có thể xảy ra. Nhưng nếu sau đó, có khả năng bạn nên refactor mã của bạn.

+1

Câu trả lời hay. Cảm ơn! – anschauung

2

Nếu bạn không sử dụng break; để đóng mỗi câu lệnh PHP sẽ tiếp tục đánh giá các trường hợp cho đến khi kết thúc khối switch có thể tác động đến hiệu suất trong một khối đủ lớn. Thứ tự sau đó trở nên quan trọng để nhận được hành vi mà bạn đang tìm kiếm.

Từ PHP.Net:

Các câu lệnh switch thực hiện từng dòng (trên thực tế, tuyên bố của tuyên bố). Ban đầu, không có mã nào được thực hiện. Chỉ khi một câu lệnh case được tìm thấy với một giá trị khớp với giá trị của biểu thức chuyển đổi thì PHP bắt đầu thực hiện các câu lệnh. PHP tiếp tục thực thi các câu lệnh cho đến khi kết thúc khối chuyển đổi, hoặc lần đầu tiên nó thấy một câu lệnh break. Nếu bạn không viết một câu lệnh break ở cuối danh sách câu lệnh của trường hợp, PHP sẽ tiếp tục thực hiện các câu lệnh của trường hợp sau đây. Ví dụ:

<?php 
    switch ($i) { 
     case 0: 
      echo "i equals 0"; 
     case 1: 
      echo "i equals 1"; 
     case 2: 
      echo "i equals 2"; 
    } 
?> 

tôi sẽ thận trọng chống lại phụ thuộc vào hành vi này dù và sử dụng break; cho mỗi case như rằng sẽ loại bỏ một số mơ hồ khi bạn xem lại đoạn code sau.

0

Thông thường, bạn nên viết nhiều khả năng nhất trường hợp trước tiên, thứ hai tiếp theo ...

nhưng cũng giống như Alex đã viết,

này có khả năng sẽ được gọi là một vi tối ưu hóa. Tôi không tin rằng sẽ có sự khác biệt lớn.

6

Bạn sẽ cần nhiều hơn 1000 trường hợp để nhận thấy sự khác biệt, nhưng có, có sự khác biệt. Tôi đã viết một bài kiểm tra:

function test_switch($value) { 

    $startTime = time() + microtime(); 

    for ($i = 0; $i < 10000000; $i++) { 

    switch($value) { 

    case "abcdefg": 
     $j = $j + 1; 
     break; 
    case "hijklmno": 
     $j = $j + 1; 
     break; 
    } 
    } 

    $endTime = time() + microtime(); 

    echo "Total time for argument $value: " . ($endTime - $startTime) . "<br>\n"; 
} 

test_switch("abcdefg"); 
test_switch("hijklmno"); 

Đó là 10 triệu thực thi lệnh chuyển đổi. Đầu ra là:

Total time for argument abcdefg: 3.99799704552 
Total time for argument hijklmno: 5.38317489624 

Vì vậy, có sự khác biệt, nhưng nó sẽ không đáng chú ý cho đến khi bạn đạt đến thứ tự 10 triệu thực thi, tùy thuộc vào bộ vi xử lý của bạn.

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