Pull to refresh

Comments 5

Если в switch вкрутить оператор, допустим, "checkup", который прыгал бы обратно в SWITCH_STRING, получится идеальная конструкция под конечный автомат

Как же заедолбали эти сгенерированные картинки для КДПВ. Вы хоть сами читайте что там понаписано, а то уже антиреклама какая-то получается.

Ну вот что это?
Кавычки? Скобочки? А что за "ebon" - вы с какого сайта перешли в эту рисовалку?
Кавычки? Скобочки? А что за "ebon" - вы с какого сайта перешли в эту рисовалку?

Оба интересны, но это одиночные ветвления - у них нет той разницы между O(N) и O(1), которая делает сравнение if/else vs switch/match таким наглядным.

В разбираемом кейсе для ?? как раз есть неплохое применение. Например, что-то вроде

$status = 'silver';
$discountTiers = [
    'gold' => 30,
    'silver' => 20,
    'bronze' => 10,
];
$discount = $discountTiers[$status] ?? 0;

можно было бы добавить в бенчмарк для пущей наглядности.

Интересный вариант :)

L0002 0000 ASSIGN CV0($status) string("silver")
L0004 0001 ASSIGN CV1($discountTiers) array(...)
L0010 0002 T5 = FETCH_DIM_IS CV1($discountTiers) CV0($status)
L0010 0003 T6 = COALESCE T5 0005
L0010 0004 T6 = QM_ASSIGN int(0)
L0010 0005 ASSIGN CV2($discount) T6

FETCH_DIM_IS - это тот же поиск в хеш-таблице, что и внутри SWITCH_STRING/MATCH.

По сути это самый прямой способ найти значение по ключу в хеш-таблице, а если нет - вот дефолт. Без обёрток, fallback-цепочек и break.

P.S.: Проверил на 50млн итераций - скорость ?? и match одинаковая (в рамках погрешностей).

Давно заметил, что неочевидные решения зачастую дают лучшую производительность.

Плюс, ещё здесь можно было бы попробовать немного сэкономить на спичках, поместив массив в opcache, чтобы каждый раз не создавать, но я не уверен, будет ли это полезно в нашем случае, или накладные расходы перевесят полезный эффект.

Sign up to leave a comment.

Articles