Home > Article > Backend Development > 关于 eval 的优化,基于使用eval这个方法实现效率低上的有关问题
关于 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 />