PHP is_numeric vs~(〜(float)$ value)性能和功能

问题描述 投票:1回答:1

最近我想尽可能快地在数组中搜索数值(整数,双数和带指数表示法的数字)。

我最初使用'is_numeric()',因为我们经常使用它作为我们的goto进行检查,但我想看看我是否可以加快速度。

我注意到如果我转换为浮动,那么只要值为数值,PHP就会产生一个非零的值。因此,使用按位运算符,我可以在搜索周围的if语句中执行逻辑非零。

if (~(~(float)$value)) {
// add to result array
}

在初步测试后,我发现事情似乎加速了2秒,中等大小的数字和非数字。然而,这仅仅是一个简单的单元测试。

有没有人有作为浮动vs is_numeric的铸造性能的经验?我知道它们可能不是100%在功能上等效(我认为浮动的转换将转换为十六进制)但是对于我的目的,我只会使用指数表示法来铸造整数,双精度数和数字。这是一个超过is_numeric()的性能提升还是我想象中的?

php floating-point bitwise-operators
1个回答
1
投票

警告! 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 

如果你这样做你可以获得性能,但根据你必须做什么,你可以打开一个安全漏洞!

© www.soinside.com 2019 - 2024. All rights reserved.