2010-01-28 10 views
52

Bản sao có thể xảy ra:
is “else if” faster than “switch() case” ?
What is the relative performance of if/else vs. switch in Java?Trường hợp so với trường hợp khác: Cách nào hiệu quả hơn?

Ive được mã hóa-in-the-chạy một lần nữa .... khi bước gỡ lỗi thông qua một tuyên bố trường hợp nó nhảy tới mục phù hợp với các điều kiện ngay lập tức, tuy nhiên khi cùng một logic được xác định bằng cách sử dụng nếu/else nó bước qua mỗi câu lệnh if cho đến khi nó tìm thấy người chiến thắng. Tuyên bố trường hợp có hiệu quả hơn hay là trình gỡ lỗi của tôi chỉ tối ưu hóa bước qua? (Đừng lo lắng về cú pháp/lỗi, tôi đã gõ vào SO này, không biết nếu nó sẽ biên dịch, nguyên tắc của nó là sau, tôi không muốn làm chúng như là nguyên nhân khiến tôi mơ hồ nhớ điều gì đó về trường hợp sử dụng một bù đắp với ints) Tôi sử dụng C#, nhưng im quan tâm đến một câu trả lời chung trên các ngôn ngữ lập trình.

switch(myObject.GetType()){ 

    case typeof(Car): 
     //do something 
     break; 

    case typeof(Bike): 
     //do something 
     break; 

    case typeof(Unicycle): 
     //do something 
     break; 

    case default: 
     break; 
} 

VS

Type myType = myObject.GetType(); 

    if (myType == typeof(Car)){ 
      //do something 
    } 

    else if (myType == typeof(Bike)){ 
      //do something 
    } 

    else if (myType == typeof(Unicycle)){ 
      //do something 
    } 
    else{ 

    } 
+8

Điều này thậm chí không * đóng * để trở thành bất khả tri về ngôn ngữ, mọi câu trả lời sẽ được ràng buộc chặt chẽ với một ngôn ngữ cụ thể. – skaffman

+3

chưa kể đến phiên bản trình biên dịch và trình biên dịch cụ thể. –

+0

Nó có thể khác nhau giữa các ngôn ngữ, trình biên dịch và thời gian chạy. Không có cách nào để biết chắc chắn. – FrustratedWithFormsDesigner

Trả lời

69

Dường như trình biên dịch tốt hơn trong việc tối ưu hóa lệnh chuyển đổi so với câu lệnh if.

Trình biên dịch không biết liệu thứ tự đánh giá các câu lệnh if có quan trọng với bạn hay không và không thể thực hiện bất kỳ tối ưu hóa nào ở đó. Bạn có thể gọi các phương thức trong các câu lệnh if, ảnh hưởng đến các biến. Với câu lệnh switch, nó biết rằng tất cả mệnh đề có thể được đánh giá cùng một lúc và có thể đặt chúng theo thứ tự nào hiệu quả nhất.

Dưới đây là một so sánh nhỏ:
http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx

+1

Tôi không hiểu phần này "Bạn có thể gọi các phương thức trong các câu lệnh if, ảnh hưởng đến các biến" Làm thế nào điều này có thể xảy ra trong trường hợp khác? Tôi nghĩ đó là như nhau. – Castelmager

+0

Bạn có thể thực hiện nếu (++ i) {....}, nhưng bạn không thể thực hiện điều đó trong câu lệnh trường hợp chuyển đổi. – Granada

0

tôi nghĩ rằng nó chỉ là trình gỡ lỗi làm cho nó đơn giản. Lưu ý rằng một trường hợp và "nếu danh sách" không phải là cuối cùng giống nhau. Có một lý do tại sao các trường hợp khối thường là kết thúc bằng "ngắt". Các trường hợp stmt thực sự trông giống như thế này khi bị hỏng trong lắp ráp.

if myObject.GetType() == type of Car 
    GOTO START_CAR 
else if myObject.GetType() == type of Bike 
    GOTO START_BIKE 

LABEL START_CAR 
//do something car  
GOTO END 

LABEL START_BIKE 
//do something bike 
GOTO END 

LABEL END 

Nếu bạn không có giờ nghỉ, sau đó các khối trường hợp sẽ là thiếu "GOTO END" stmts, và trong thực tế nếu bạn đặt chân đến "xe hơi" trường hợp bạn thực sự muốn chạy cả hai phần

0

Tôi tin rằng vì các trường hợp phải là giá trị không đổi, nên câu lệnh chuyển đổi thực hiện tương đương với goto, do đó dựa trên giá trị của biến nó nhảy đến đúng trường hợp, trong khi câu lệnh if/then phải đánh giá mỗi biểu thức.

7

Các debugger là làm cho nó đơn giản hơn, bởi vì bạn không muốn bước qua đoạn code thực tế mà trình biên dịch tạo ra.

Nếu chuyển đổi chứa nhiều hơn năm mục, nó được triển khai bằng cách sử dụng bảng tra cứu hoặc bảng băm, nếu không nó được triển khai bằng cách sử dụng if..else.

Xem câu hỏi có liên quan chặt chẽ is “else if” faster than “switch() case” ?.

Các ngôn ngữ khác so với C# dĩ nhiên sẽ thực hiện nhiều hơn hoặc ít hơn một cách khác nhau, nhưng công tắc thường hiệu quả hơn.

5

Nhiều ngôn ngữ lập trình tối ưu hóa câu lệnh chuyển đổi sao cho nhanh hơn nhiều so với tiêu chuẩn if-else nếu cấu trúc cung cấp các trường hợp là hằng số trình biên dịch. Nhiều ngôn ngữ sử dụng bảng nhảy hoặc được lập chỉ mục branch table để tối ưu hóa các câu lệnh chuyển đổi. Wikipedia có một cuộc thảo luận tốt về tuyên bố chuyển đổi. Ngoài ra, here là một cuộc thảo luận về tối ưu hóa chuyển đổi trong C.

Một điều cần lưu ý là báo cáo chuyển đổi có thể bị lạm dụng và tùy theo trường hợp, có thể sử dụng đa hình thay vì câu lệnh chuyển. Xem here để biết ví dụ.

0

Wikipedia Switch statement entry là khá lớn và thực sự khá tốt. Điểm thú vị:

  • Chuyển đổi vốn không nhanh. Nó phụ thuộc vào ngôn ngữ, trình biên dịch và sử dụng cụ thể.
  • Trình biên dịch có thể tối ưu hóa các chuyển đổi bằng cách sử dụng bảng nhảy hoặc con trỏ hàm được lập chỉ mục.
  • Tuyên bố được lấy cảm hứng từ một số phép tính thú vị từ Stephen Kleene (và các loại khác).

Để tối ưu hóa lạ và thú vị bằng cách sử dụng công tắc C, xem Duff's Device.