2012-08-24 38 views
7

Tôi biết rằng trong câu lệnh chuyển đổi không nên được sử dụng khi bạn có vài trường hợp và trong trường hợp này, tốt hơn nên sử dụng if else if.groovy 'switch' so với 'if' hiệu suất

Điều đó có đúng với tiếng groovy không?

Trình diễn nào hiệu quả hơn giữa hai mã này?

myBeans.each{ 
    switch it.name 
    case 'aValue': 
     //some operation 
    case 'anotherValue: 
     //other operations 
} 

hay:

myBeans.each{ 
    if(it.name == 'aValue'){ 
     //some operation 
    } 
    else if (it.name =='anotherValue){ 
     //other operations 
    } 
} 
+3

Đây có phải là mối quan tâm thực sự hay chỉ là sự tò mò? Không chắc đây sẽ là nút cổ chai hiệu suất ở bất kỳ đâu trong một ứng dụng thực sự. Nếu bạn thực sự tò mò, tại sao bạn không chỉ chạy một số xét nghiệm và tìm hiểu? –

+0

Đó chỉ là sự tò mò để biết điều gì xảy ra bên trong JVM khi tôi sử dụng _switch_ – rascio

Trả lời

13

Trong Java, "chuyển đổi" là Effient hơn serial nếu khối vì trình biên dịch tạo ra một hướng dẫn tableswitch nơi mục tiêu có thể được xác định từ một bảng nhảy.

Trong Groovy, chuyển đổi không bị hạn chế thành giá trị số nguyên và có nhiều ngữ nghĩa bổ sung, do đó trình biên dịch không thể sử dụng cơ sở đó. Trình biên dịch tạo ra một loạt các so sánh, giống như nó sẽ làm cho nối tiếp nếu các khối.

Tuy nhiên, ScriptBytecodeAdapter.isCase(switchValue, caseExpression) được gọi cho mỗi lần so sánh. Điều này luôn luôn là một phương thức động gọi tới phương thức isCase trên đối tượng caseExpression. Cuộc gọi đó có khả năng đắt hơn ScriptBytecodeAdapter.compareEqual(left, right) được gọi để so sánh nếu.

Vì vậy, trong Groovy, công tắc thường đắt hơn nối tiếp nếu khối.

+1

Ngoài sự tò mò, bạn có biết những thay đổi về điều này trong Groovy 2.0 bằng cách sử dụng trình biên dịch tĩnh không? – cdeszaq

+0

Câu hỏi thú vị, tôi vừa kiểm tra nó. Như tôi mong đợi, nó không thay đổi các cuộc gọi thành ScriptBytecodeAdapter. Vì vậy, mặc dù @CompileStatic buộc các lời gọi phương thức tĩnh trong phương thức đã chọn, "chuyển đổi" và "nếu" vẫn tiếp tục thực hiện các cuộc gọi phương thức động thông qua ScriptBytecodeAdapter. –

+0

Tôi tự hỏi nếu đây không phải là nơi để tối ưu hóa tốc độ có thể không? – cdeszaq

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