Câu hỏi Lệnh chuyển đổi có ảnh hưởng đến tốc độ không? [bản sao]


Câu hỏi này đã có câu trả lời ở đây:

Tôi đã cố gắng để google này, nhưng không có may mắn.

Tôi có một công tắc rất lớn, và một số trường hợp rõ ràng là phổ biến hơn hơn những người khác.

Vì vậy, tôi muốn biết nếu thứ tự thực sự được tổ chức như nó là và các trường hợp "trên" được kiểm tra trước khi "thấp hơn", do đó được đánh giá nhanh hơn.

Tôi muốn giữ trật tự của mình, nhưng nếu nó đau quá tốc độ, thì việc sắp xếp lại các nhánh cây sẽ là một ý tưởng hay.

Để minh họa:

switch (mark) {
        case Ion.NULL:
            return null;

        case Ion.BOOLEAN:
            return readBoolean();

        case Ion.BYTE:
            return readByte();

        case Ion.CHAR:
            return readChar();

        case Ion.SHORT:
            return readShort();

        case Ion.INT:
            return readInt();

        case Ion.LONG:
            return readLong();

        case Ion.FLOAT:
            return readFloat();

        case Ion.DOUBLE:
            return readDouble();

        case Ion.STRING:
            return readString();

        case Ion.BOOLEAN_ARRAY:
            return readBooleans();

        case Ion.BYTE_ARRAY:
            return readBytes();

        case Ion.CHAR_ARRAY:
            return readChars();

        case Ion.SHORT_ARRAY:
            return readShorts();

        case Ion.INT_ARRAY:
            return readInts();

        case Ion.LONG_ARRAY:
            return readLongs();

        case Ion.FLOAT_ARRAY:
            return readFloats();

        case Ion.DOUBLE_ARRAY:
            return readDoubles();

        case Ion.STRING_ARRAY:
            return readStrings();

        default:
            throw new CorruptedDataException("Invalid mark: " + mark);
    }

76
2018-04-21 19:36


gốc


Nó không phải là một nút cổ chai, và tôi đã lược tả nó thực sự. Tôi chỉ muốn biết nếu điều này thực sự ảnh hưởng đến tốc độ thực hiện - ra khỏi tò mò, khá nhiều. - MightyPork
Tôi khá chắc chắn rằng thứ tự không tạo ra sự khác biệt nào cả. Các JVM không đi qua các trường hợp để giống như một lớn khác dài / nếu. Đó là nhiều hơn một "nhìn lên nơi để đi tiếp theo" loại điều. - Dawood ibn Kareem
Phải, nhưng nó phải trải qua một số loại bảng tra cứu để làm điều này, đúng không? - MightyPork
Đầu tiên của tất cả sự khác biệt về tốc độ sẽ được tối thiểu không có vấn đề gì phương pháp tiếp cận trình biên dịch sử dụng trừ khi bạn có hàng ngàn trường hợp. Thứ hai, loại khai báo là gì mark? Nếu nó là một enum thì một bảng nhảy sẽ được sử dụng; nếu đó là một int thì nó sẽ sử dụng một bảng nhảy hoặc một loạt các if-then-elses tùy thuộc vào "mật độ" của các giá trị. - Jim Garrison
Trong ví dụ này sử dụng định hướng đối tượng và đa hình có thể là một cách tiếp cận tốt hơn. Ví dụ IonBase định nghĩa và phương thức trừu tượng read(); FloatIon, BooleanIon, BooleanArrayIon, vv ghi đè read(). Và thay vì switch làm return mark.read(). - Kasper van den Berg


Các câu trả lời:


Sắp xếp lại câu lệnh chuyển đổi không có bất kỳ ảnh hưởng nào.

Xem thông số Java bytecode, một switch có thể được biên dịch thành lookupswitch hoặc một tableswitch hướng dẫn, chuyển đổi trên int. A lookupswitch luôn được biên dịch với các giá trị có thể theo thứ tự sắp xếp, do đó sắp xếp lại các hằng số trong mã sẽ không bao giờ quan trọng và tableswitch chỉ có một loạt các bước nhảy có thể liên quan đến một bù đắp được chỉ định, do đó, nó cũng không bao giờ quan tâm đến thứ tự ban đầu.

Xem http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.lookupswitch và http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.tableswitch để biết chi tiết.


109
2018-04-21 19:50



Wow, thành thật mà nói, tôi thậm chí không biết bytecode có thông số kỹ thuật: D / Ok, vì vậy tôi sẽ không làm hỏng công tắc của tôi để có được tốc độ tăng tốc tưởng tượng. - MightyPork
Tôi cho rằng câu hỏi tiếp theo là: thứ tự các giá trị được sắp xếp có quan trọng không? (nếu Ion.NULL phổ biến hơn Ion.BOOLEAN, nó sẽ nhanh hơn nếu Ion.NULL <Ion.BOOLEAN?) - immibis
Xem thêm stackoverflow.com/questions/12020048/… - Raedwald