我知道这不会对性能产生巨大影响,我只是出于好奇而要求。
逻辑上计算检查!=应该比通过比较减法运算的结果与零检查更快。但是我不确定这个以及关于PHP的引擎。为了清楚起见,我已经编写了代码示例。
if (date('d', $ar[i]) != $current_day)
与
if ((intval(date('d', $ar[i])) - intval($current_day)) > 0)
答案 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?)
这意味着无论函数本身有多快:一个操作总是比两个操作快,因为这里描述的所有函数的速度几乎相同。