2012-12-30 33 views
12

thể trùng lặp:
What is the relative performance difference of if/else versus switch statement in Java?Tại sao một "if" chậm hơn "switch"?

Với hai phương pháp sau đây:

public static int useSwitch(int i) { 
    switch (i) { 
    case 0: 
     return 1; 
    default: 
     return 0; 
    } 
} 

public static int useIf(int i) { 
    if (i == 0) 
     return 1; 
    return 0; 
} 

thử nghiệm cho thấy switch thực hiện nhẹ nhanh hơn (1,4 nano giây cho mỗi cuộc gọi trên máy tính của tôi) so với phiên bản if.

Tôi đã luôn tin rằng lợi ích của một switch không đá cho đến khi ít nhất một vài ifs có thể tránh được,

Tại sao switch nhanh hơn so với một đơn if?

+4

Bạn có biết cách chúng được biên dịch không? Có lẽ bạn có thể tìm thấy câu trả lời của bạn ở đó. – user1306322

+2

@ user1306322- Bạn sẽ phải xem xét kỹ hơn để điều tra cách JVM diễn giải hoặc biên dịch bytecode đó. Mã đầu tiên có thể sẽ sử dụng lệnh 'lookupswitch' hoặc' tableswitch', trong khi mã thứ hai sẽ sử dụng các bước nhảy bình thường. Đó là tất cả lên đến JVM để làm cho họ làm việc nhanh. – templatetypedef

+3

Bạn có thể đăng mã điểm chuẩn của mình không? –

Trả lời

7

Bằng cách kiểm tra các bytecode kết quả được như mong đợi:

CÔNG TẮC

public static useSwitch(I)I 
L0 
    ILOAD 0 
    TABLESWITCH 
    0: L1 
    default: L2 
L1 
    INVOKESTATIC Tests.a()I 
    IRETURN 
L2 
    INVOKESTATIC Tests.b()I 
    IRETURN 

NẾU

public static useIf(I)I 
L0 
    ILOAD 0 
    IFNE L1 
L2 
    INVOKESTATIC Tests.a()I 
    IRETURN 
L1 
    INVOKESTATIC Tests.b()I 
    IRETURN 

Bây giờ tôi không thấy bất kỳ lý do cụ thể cho cái nào nên được chậm hơn so với khác (không phải bởi một số lượng có ý nghĩa trong mọi trường hợp). Đây chắc chắn là một cái gì đó có liên quan đến việc thực hiện JVM cụ thể và cách nó thực hiện các opcodes này. Theo kiến ​​thức chung, hướng dẫn TABLESWITCH sẽ chậm hơn trừ khi có đủ trường hợp làm cho giá trị xây dựng của nó có giá trị nhưng đây chỉ là suy nghĩ chung. Mỗi JVM có thể thực hiện nó một cách khác nhau vì vậy đây chỉ là suy đoán.

Bạn có chắc chắn định cấu hình mọi thứ theo cách nhất quán không? (bằng cách dành thời gian cho JVM để làm ấm lên, bằng cách chỉ giữ kết quả trong phạm vi tin cậy và tất cả những thứ khác tạo đủ thông tin chính xác để sử dụng)

+0

Tôi phải thú nhận rằng sau khi chạy thử nghiệm nhiều lần, * đôi khi * nếu nhanh hơn công tắc. Nhận xét của bạn về việc không có bất kỳ lý do cụ thể nào cho sự khác biệt phản ánh những gì tôi thấy với thử nghiệm tiếp theo – Bohemian

0

Loại so sánh này được phân tích trong If-else vs switch – Which is better?. Tuy nhiên, hãy thử biên dịch thành mã gốc bằng gcj và so sánh kết quả thu được với kết quả từ việc sử dụng bytecode.

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