【问题标题】:PHP: How does the Not-equal and Not-identical Operators work and are they faster then the Equal or Identical Operators?PHP:不等于和不相同的运算符是如何工作的,它们比相等或相同的运算符更快吗?
【发布时间】:2017-05-18 06:21:13
【问题描述】:

我问的是比较, 假设我有 2 个小文本:

  • abc:“这是一个很长的文本”
  • xyz: "xThis is a very long Text"

PHP 是比较每个字符还是将它们作为带有掩码的二进制进行比较?

abc !== xyz 为例,如果 PHP 按字符进行比较,那么 not-equal 会更快,因为它会在第一个字符之后中断?

我已经阅读过以下问题: How do the PHP equality (== double equals) and identity (=== triple equals) comparison operators differ?

所以我知道 ===== 快是因为 Casting。

但是与!==!= 相比,===== 是什么?

【问题讨论】:

  • “将它们与掩码进行二进制比较”是什么意思?如您链接到的答案中所述,!=/!== 在这方面与==/=== 相同。
  • 也许我错了,但因为“面具”,你可以在这里阅读:en.wikipedia.org/wiki/Mask_(computing)

标签: php string performance comparison-operators


【解决方案1】:

字符串被定义为一个结构here

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

相等运算符定义为here。 (以下三个相等运算符的执行方式基本相同,只是它们跳过地址检查,因为它总是为假)

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 避免检查字符串的每个字符,唯一会检查每个字符的情况是,如果字符串中除最后一个字符之外的每个字符都相等,并且字符串是一样的。

我必须说:如果你真的担心===!== 慢,那么你really shouldn't be

【讨论】:

  • 这对我有很大帮助,但并没有真正解决我的问题,因为我仍然不知道 zend_string_equals 函数将用于哪个运算符。所以 atm 我认为它将用于 "===" 和 "!==" 只是一个否定而不是一个自己的功能,对吧?
  • @Regda 将用于比较字符串(假设字符串不是数字,它将与===== 一起使用) -- 用于比较不同类型,您应该查看规则比较here.
猜你喜欢
  • 2010-09-09
  • 2019-05-19
  • 2010-11-05
  • 1970-01-01
  • 2011-06-11
相关资源
最近更新 更多