通过不等式运算符检查两个值比通过在PHP中减去检查更快吗?

时间:2015-07-16 09:01:47

标签: php performance

我知道这不会对性能产生巨大影响,我只是出于好奇而要求。

逻辑上计算检查!=应该比通过比较减法运算的结果与零检查更快。但是我不确定这个以及关于PHP的引擎。为了清楚起见,我已经编写了代码示例。

if (date('d', $ar[i]) != $current_day)

if ((intval(date('d', $ar[i])) - intval($current_day)) > 0)

2 个答案:

答案 0 :(得分:1)

嗯,这取决于$current_day的类型,因为PHP's type juggling behavior会在运算符的arity属于不同类型时尝试强制转换。因此,例如,如果$current_day是一个整数,那么PHP将会转换date的返回字符串,并最终成为整数比较。当然,演员阵容本身可能会带来更多开销,但这几乎与你使用intval所做的一样,加上函数调用的额外成本(比演员要慢得多)。如果它们都是两个字符串,那么比较可能比整数数学慢,但请记住,此时你正在谈论纳秒。

内部实施

如果您真的对PHP如何比较两个字符串的内部实现感兴趣,那么它基本上只是C99 memcmp(3)

如果您有兴趣,请点击relevant C code in the Zend engine

ZEND_API int ZEND_FASTCALL zend_binary_strcmp(const char *s1, size_t len1, const char *s2, size_t len2) /* {{{ */
{
    int retval;

    if (s1 == s2) {
        return 0;
    }
    retval = memcmp(s1, s2, MIN(len1, len2));
    if (!retval) {
        return (int)(len1 - len2);
    } else {
        return retval;
    }
}
/* }}} */

基本上是线性时间比较。

最后的澄清

由于表现对我很感兴趣,我觉得解释为什么你的假设!=比较应该比理论上的减法更快是有益的。

在机器ISA的最低级别,减法需要将两个整数移动到寄存器中,然后将结果寄存器移回存储器以便稍后进行评估。 !=的比较在ISA级别更简单(再次假设x86架构在这里),因为结果寄存器不需要存储,可以直接用于值操作中的事实。

所以再一次,你基本上谈论的是从CPU到RAM的额外命中之间的差异,你的CPU可能会在其中缓存数据L1缓存,以及额外的指令,CPU也极有可能在其代码L1缓存中缓存。虽然在实践中我们在这里有更多层次的高级代码,但这在实践中可能会或可能不会实现。

当然,只有在比较两个整数时,这才适用。如果您要比较两个字符串,则必须比较两个字符串的内存中的每个字节,直到遇到不匹配或内存块结束为止。所以需要多走一趟。

答案 1 :(得分:0)

让我们假设你在这种情况下使用时间戳,所以它的实际数字,而不是字符串,因为你不能从另一个字符串中减去字符串。

在你的例子中,你在一边有一张支票(是A不是B?)而另一边有两张支票(C是A-B,是C大于0?)

这意味着无论函数本身有多快:一个操作总是比两个操作快,因为这里描述的所有函数的速度几乎相同。

相关问题