关于 eval 的优化,基于使用eval这个方法实现效率低下的问题
需求:
根据一些指定的计算公式去获得期待值。
例子:
<br />
//提供的数据源<br />
$row = array(<br />
'pv' => 50,<br />
'uv' => 6,<br />
'st' => 650,<br />
'nuv' => 2<br />
);<br />
//需求公式,可能有些量不存在:如no<br />
$gx = '(pv+uv)/(uv-nuv+1)*10+nuv-uv+no/0+3.5';<br />
$gx = preg_replace('/[a-z][a-z_\d]+/i', ' $row[\'${0}\'] ', $gx);//处理过后公式<br />
$str = "@\$s = $gx;";//合法php语句<br />
try{<br />
@eval($str);//str和eval前使用@确保不显示错误,如某个变量不存在,或除数为0等<br />
}catch(Exception $e){}<br />
<br />
//这个方结果可求出<br />
<br />
//提供的数据源,需要先进行排序,将字符数多的键排前面<br />
$row = array(<br />
'nuv' => 2,<br />
'pv' => 50,<br />
'uv' => 6,<br />
'st' => 650,<br />
);<br />
<br />
$search = array_keys($row);<br />
$replace = array_values($row);<br />
<br />
function cal()<br />
{<br />
global $search, $replace;<br />
<br />
//需求公式,可能有些量不存在:如no<br />
$gx = '(pv+uv)/(uv-nuv+1)*10+nuv-uv+no/0+3.5';<br />
$gx = str_replace($search, $replace, $gx);// 改用str_replace替代preg_replace,效率会高一些<br />
$str = "@\$s = $gx;";//合法php语句<br />
try{<br />
@eval($str);//str和eval前使用@确保不显示错误,如某个变量不存在,或除数为0等<br />
}catch(Exception $e){}<br />
}<br />
<br />
<br />
$t1 = microtime(true);<br />
for ($i = 0; $i < 10000; $i++)<br />
{<br />
cal();<br />
}<br />
echo microtime(true) - $t1;<br />
<br />
// output: 0.18727397918701<br />
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号