string — PHP: Как работают операторы «Не равен» и «Не идентичен», и они быстрее, чем операторы «Равен» или «Идентично»?

Я спрашиваю о сравнении,
допустим, у меня есть 2 небольших текста:

  • abc: «Это очень длинный текст»
  • xyz: «Это очень длинный текст»

Сравнивает ли PHP каждый символ или сравнивает их как двоичные с масками?

Как пример abc !== xyz, если PHP сравнивает их по символам, то неравенство будет быстрее, потому что оно ломается после первого символа?

Я уже читал такие вопросы, как:
Чем отличаются операторы сравнения PHP (== double equals) и тождества (=== triple equals)?

Итак, я знаю, что === быстрее чем == из-за кастинга.

Но что с === или же == по сравнению с !== или же != ?

0

Решение

Строки определяются как структура Вот:

typedef struct {
char *c;
size_t len;
size_t a;
} smart_string;

Оператор равенства определен Вот. (Следующие три оператора равенства также работают по существу одинаково, за исключением того, что они пропускают проверку адреса, поскольку она всегда будет ложной)

static zend_always_inline zend_bool zend_string_equals(zend_string *s1, zend_string *s2)
{
return s1 == s2 || (ZSTR_LEN(s1) == ZSTR_LEN(s2) && !memcmp(ZSTR_VAL(s1), ZSTR_VAL(s2), ZSTR_LEN(s1)));
}

Если вы не говорите на C:

Сначала сравнивается адрес каждой строковой структуры. Если они равны, то строки должны быть равны. В противном случае, дальнейшие проверки сделаны.

Во-вторых, если адреса не равны, то сравнивается длина каждой строки. Это просто проверка на целочисленное равенство, так как длина является частью определения структуры строки. Если длины не равны, возвращается false.

Затем содержимое памяти проверяется для каждой строки с memcmp. Так как memcmp возвращает 0, если содержимое памяти равно, это отрицается, чтобы вернуть true.

Чтобы явно ответить на ваш вопрос: PHP избегает проверки каждого символа строки, единственный случай, когда каждый символ будет проверяться, это то, что если все символы строки, кроме последнего символа, равны, и что длины строк являются так же.

Я должен сказать: если вы действительно беспокоитесь о === быть медленнее, чем !==, затем вы на самом деле не должно быть.

0

Другие решения

Других решений пока нет …