最近我想尽可能快地在数组中搜索数值(整数,双数和带指数表示法的数字)。
我最初使用'is_numeric()',因为我们经常使用它作为我们的goto进行检查,但我想看看我是否可以加快速度。
我注意到如果我转换为浮动,那么只要值为数值,PHP就会产生一个非零的值。因此,使用按位运算符,我可以在搜索周围的if语句中执行逻辑非零。
if (~(~(float)$value)) {
// add to result array
}
在初步测试后,我发现事情似乎加速了2秒,中等大小的数字和非数字。然而,这仅仅是一个简单的单元测试。
有没有人有作为浮动vs is_numeric的铸造性能的经验?我知道它们可能不是100%在功能上等效(我认为浮动的转换将转换为十六进制)但是对于我的目的,我只会使用指数表示法来铸造整数,双精度数和数字。这是一个超过is_numeric()的性能提升还是我想象中的?
警告! isnumeric()不只是一时兴起,我附上一小段代码,向您显示转换类型所犯的错误。在许多针对php的攻击中,有些字符串可以是数字和吱吱声,攻击者会注入错误的代码。
码:
<?php
$a="1809809808908099878758765<?php echo \"I powned you\"; ?>";
echo is_numeric($a)?"yes":"no"; // out no
echo "\n";
echo (~(~(float)$a))?"Yes":"No"; // out Yes
如果你这样做你可以获得性能,但根据你必须做什么,你可以打开一个安全漏洞!