PHP-以递归方式将字符串替换为数字花费的时间太长
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了PHP-以递归方式将字符串替换为数字花费的时间太长,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2599字,纯文字阅读大概需要4分钟。
内容图文
由于MYSQL的“ SELECT”会选择整数并将其作为字符串进行浮点运算,因此我需要从JS中获得的每个响应都必须位于正确的数据模型中-
> 1不是“ 1”,
> 53.2而不是“ 53.2”,
我创建了适用于混合类型的递归函数-数组/对象:
private function cast_number(&$mixed) {
if(is_array($mixed)) {
foreach ($mixed as $key => $val)
if (is_numeric($val))
$mixed[$key] = (double)$val;
else if (is_array($val) || is_object($val))
$mixed[$key] = $this->cast_number($val);
} else if(is_object($mixed)) {
foreach ($mixed as $key => $val)
if (is_numeric($val))
$mixed->$key = (double)$val;
else if (is_array($val) || is_object($val))
$mixed->$key = $this->cast_number($val);
}
return $mixed;
}
相当简单的功能-如果为数字,则转换为双精度,如果为数组或对象,则递归遍历.
这里的一切都准备就绪.
我对此有两个问题:
-在6MB的数据上,大多数数字以字符串表示,花费了0.5秒
-在200MB的数据上(是的,我需要它,请不要专注于它),在几分钟(通常是几秒钟)后失败,表示需要4GB以上的内存.
>如何改善此功能? (速度,内存)
>为什么要花这么长时间?甚至json_encode,我认为更大的功能也需要更少的时间.
解决方法:
因为强制used to be faster than casting,所以我运行了这段代码来计算PHP 7上的计时:
function getTime($start) {
return round((microtime(true) - $start) * 1000000) / 1000;
}
function mockData($length) {
$data = [];
$i = -1;
while ($i++ < $length) {
$data[$i] = strval(rand(1, 10000) / 100);
}
return $data;
}
$data = mockData(100000);
// Let's check that they are string before
echo gettype($data[0]) . '<br><br>';
$start = microtime(true);
$convertedData = [];
foreach ($data as $key => $value) {
$convertedData[$key] = (double) $value;
}
echo '(double) cast took ' . getTime($start) . ' ms.<br>';
$start = microtime(true);
$convertedData = [];
foreach ($data as $key => $value) {
$convertedData[$key] = 0 + $value;
}
echo 'Coercion took ' . getTime($start) . ' ms.<br>';
我的结果是:
(double) cast took 27.508 ms.
Coercion took 28.789 ms.
结论
由于使用floatval(实现字符串到双精度转换的第三种方法)的时间更长,因此使用PHP不能做得更好.您要实现的是脚本操作,不应将其用作Web应用程序的常规后端操作.
但是,如果您仍然想这样做,可以在php.ini文件as long as you don’t use the -1 workaround中提高memory_limit的值.
更新
我忘记了一种可能的优化,您应该pass your variable by reference至少执行立即分配:
$start = microtime(true);
foreach ($data as $key => $value) {
$data[$key] = (double) $value;
}
echo getTime($start) . ' ms.<br>';
=> 34.018毫秒
$start = microtime(true);
foreach ($data as &$value) {
$value = (double) $value;
}
echo getTime($start) . ' ms.<br>';
=> 17.081毫秒
显然,通过引用使用强制会产生更好的结果:
$start = microtime(true);
foreach ($data as &$value) {
$value = 0 + $value;
}
echo getTime($start) . ' ms.<br>';
=> 13.1毫秒
内容总结
以上是互联网集市为您收集整理的PHP-以递归方式将字符串替换为数字花费的时间太长全部内容,希望文章能够帮你解决PHP-以递归方式将字符串替换为数字花费的时间太长所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。