【问题标题】:PHP is_numeric vs ~(~(float)$value) performance and functionPHP is_numeric vs ~(~(float)$value) 性能和功能
【发布时间】:2019-08-22 10:21:06
【问题描述】:

最近我想尽快在数组中搜索数值(整数、双精度数和指数表示法的数字)。

我最初使用 'is_numeric()',因为我们经常使用它作为我们的 goto 进行检查,但我想看看我是否可以更快地输入一些东西。

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

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

在初始测试后,我发现使用中等大小的数字和非数字数组似乎可以加快 2 秒的速度。然而,这只不过是一个简单的单元测试。

有没有人有过将浮点数与 is_numeric 转换为性能的经验?我知道它们在功能上可能不是 100% 等效的(我认为强制转换为浮点数会转换为十六进制),但出于我的目的,我只会使用指数符号来转换整数、双精度数和数字。这是对 is_numeric() 的性能提升还是我想象到的?

【问题讨论】:

  • 经过更多研究并在官方答案的帮助下,我意识到它们在功能上确实不等效。因此,性能提升可能是真实的,但代价是检查价值时不那么严格。可能只用于有保证的输入。

标签: php floating-point bitwise-operators


【解决方案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 

如果你这样做,你可以获得性能,但取决于你必须做什么,你可能会打开安全漏洞!

【讨论】:

  • 谢谢!我根本没有测试过。
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 2018-11-16
  • 2014-08-05
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
相关资源
最近更新 更多