ホームページ バックエンド開発 PHPチュートリアル 关于 eval 的优化,基于使用eval这个方法实现效率低上的有关问题

关于 eval 的优化,基于使用eval这个方法实现效率低上的有关问题

Jun 13, 2016 am 11:18 AM
nbsp replace

关于 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);[email&#160;protected],如某个变量不存在,或除数为0等<br />}catch(Exception $e){}<br /><br />//这个方结果可求出<br />
ログイン後にコピー


这个方法,可能大家都想到,还有一些这个方法的变异:
1,使用 preg_replace_callback
2,preg_replace('//ie')使用e修正符,其实与1一样
3,使用sql来执行公司,"select 格式化后的公式",但这个方法不能处理no这个变量,还有除数为0时,会返回null


//以上是我目前的方法
循环1w次,0.25秒左右,
如果10w次,就2秒多了。

这个效率目前还接受不了。

哥们还有什么好办法没????


------解决方案--------------------
先支持一下楼主
------解决方案--------------------
还想怎么快,没法再快了。你直接用数据值计算:
echo ( $row['pv'] + $row['uv'] )/( $row['uv'] - $row['nuv'] +1)*10+ $row['nuv'] - $row['uv'] + $row['no'] /0+3.5;
速度应该是最快的了吧,但测试结果也一样。
------解决方案--------------------
第二种e 的效率测试了没有,感觉会快点呢。
------解决方案--------------------
<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);[email&#160;protected],如某个变量不存在,或除数为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 />
ログイン後にコピー

------解决方案--------------------
一万次 0.25 秒已经够快了

eval 时有一个语法分析过程,比较耗时

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

解決策: 組織では PIN を変更する必要があります。 解決策: 組織では PIN を変更する必要があります。 Oct 04, 2023 pm 05:45 PM

解決策: 組織では PIN を変更する必要があります。

Windows 11 でウィンドウの境界線の設定を調整する方法: 色とサイズを変更する Windows 11 でウィンドウの境界線の設定を調整する方法: 色とサイズを変更する Sep 22, 2023 am 11:37 AM

Windows 11 でウィンドウの境界線の設定を調整する方法: 色とサイズを変更する

Windows 11でタイトルバーの色を変更するにはどうすればよいですか? Windows 11でタイトルバーの色を変更するにはどうすればよいですか? Sep 14, 2023 pm 03:33 PM

Windows 11でタイトルバーの色を変更するにはどうすればよいですか?

Windows 11 でタスクバーのサムネイル プレビューを有効または無効にする方法 Windows 11 でタスクバーのサムネイル プレビューを有効または無効にする方法 Sep 15, 2023 pm 03:57 PM

Windows 11 でタスクバーのサムネイル プレビューを有効または無効にする方法

Windows 11/10修復におけるOOBELANGUAGEエラーの問題 Windows 11/10修復におけるOOBELANGUAGEエラーの問題 Jul 16, 2023 pm 03:29 PM

Windows 11/10修復におけるOOBELANGUAGEエラーの問題

Windows 11 でのディスプレイ スケーリング ガイド Windows 11 でのディスプレイ スケーリング ガイド Sep 19, 2023 pm 06:45 PM

Windows 11 でのディスプレイ スケーリング ガイド

Windows 11で明るさを調整する10の方法 Windows 11で明るさを調整する10の方法 Dec 18, 2023 pm 02:21 PM

Windows 11で明るさを調整する10の方法

iPhoneのSafariでプライベートブラウジング認証をオフにする方法は? iPhoneのSafariでプライベートブラウジング認証をオフにする方法は? Nov 29, 2023 pm 11:21 PM

iPhoneのSafariでプライベートブラウジング認証をオフにする方法は?

See all articles