strtr 関数の解析における効率の問題_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:02:45
オリジナル
876 人が閲覧しました

最近、文字列の一致と置換が必要になることが多く、以前は str_replace か preg_replace を使用していましたが、strtr が効率的だと言われているので、比較してみました。

コードは次のとおりです。 $i = 0; $t = microtime(true);
for(;$i{
$str = strtr(md5($i), $p2);
}
var_dump( microtime(true)-$t ; var_dump(microtime(true)-$t); //0.09863805770874



結果は、strtr が preg_replace よりも約 15% 効率的であることを示しています。 strtrのPHPソースコードを確認しました。コードは次のとおりです{furned_pa​​ram_count; str)、HASH_OF(*from));
Convert_to_string_ex(to);
(str), Z_STRLEN_PP(str), 1); php_strtr(Z_STRVAL_P(return_value),
STRLEN_PP(from)、
)));
}
}

まず php_strtr 関数を見てみましょう:

コードをコピーします コードは次のとおりです:是 // Trlen は、文字列 str_from と str_to の長さの最小値です。 // ;たとえば、from="ab",to="cd" とすると、'a'=>c'、'b'=>'d' という対応関係が生成されます。
for (i = 0; i < trlen; i++) {
xlat[(unsigned char) str_from[i]] = str_to[i];
}
}
なぜなら、置換する必要がある文字がこの場合、(i = 0; i < len; i++) {
のような演算を最初に判断してから値を割り当てる方が効率的です。 strtr('abcdaaabcd', 'ab', 'efd') は非常に効率的であるはずです。

(注: この操作では ecdeeefcd が出力されます)


php_strtr_array をもう一度見てください:




コードをコピーします

コードは次のとおりです:

static void php_strtr_array(zval *return_value, char *str, int slen, HashTable *hash)
{
zval **entry; **trans;
zval ctmp;
ulong num_key;
int minlen = 128*1 024;
int maxlen = 0, pos, len, found; HashTable tmp_hash;
//置換配列を tmp_hash にコピーし、添字文字列の最大長と最小長を記録します。 use using ‐ の tmp tmp t-n tmp tmp_hash hash, (void **) & Entry, & HPOS) == 成功) {
Switch (Zend_hash_get_current_key_ex (Hash, & String_key, & String_LEN, & Num_key) {
CAS) e have_key_is_string:
len = string_key_len-1 ;
if (len & lt; 1) {

e (&tmp_hash);
zend_hash_add(&tmp_hash、string_key、string_key_len、entry、sizeof(zval*)); maxlen = len) {
case hash_key_is_long:z_type(ctmp)= is_long; }
found = 0; >'f')、最初に a を e に置き換えるのではなく、最初に ab を f に置き換えます。and(zend_hash_find(&tmp_hash、key、len+1)==成功){zval tmp;
if(z_type_pp(trans)!= is_String){
strue
}
);
zend_hash_destroy(&tmp_hash);



http://www.bkjia.com/PHPjc/327900.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/327900.html

技術記事

最近、文字列の一致と置換が必要になることが多いです。以前は str_replace または preg_replace を使用することが多かったです。strtr が効率的だと言われているので、以下のようにコードをコピーします。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート