数码资讯
对strtr功能效率分析
最近,字符串匹配和替换操作经常被使用。使用前str_replace或preg_replace,据说strtr效果良好。 复制代码代码如下所示: $ I = 0; $ T =瞬时(真); ((;$ i < 1000;$ + +) { $str = strtr(MD5(为我),$ P2); } var_
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
最近,字符串匹配和替换操作经常被使用。使用前str_replace或preg_replace,据说strtr效果良好。
复制代码代码如下所示:
$ I = 0;
$ T =瞬时(真);
((;$ i < 1000;$ + +)
{
$str = strtr(MD5(为我),$ P2);
}
var_dump(瞬时(真)至T); / / 0.085476875305176
$ T =瞬时(真);
((;$ i < 2000;$ + +)
{
$str = preg_replace(P,'',MD5(我));
}
var_dump(瞬时(真)至T); / / 0.09863805770874
结果表明,strtr效率高于preg_replace约15%。
在一周结束时,strtr的PHP源代码:
复制代码代码如下所示:
php_function(strtr)
{
zval ** STR,**,**;
国际交流= zend_num_args();
/ /检查参数(zend_get_parameters_ex函数定义在zend_api。C文件)
如果(AC 3 | | zend_get_parameters_ex(AC,STR,,到)= =失败){
wrong_param_count;
}
检查参数
如果(AC = = 2 z_type_pp(从)!= is_array){
php_error_docref(空tsrmls_cc,e_warning,第二个参数不是数组。);
return_false;
}
convert_to_string_ex(STR);
空字符串的快捷方式
在zend_operators定义 / / H z_strlen_pp宏。
如果(z_strlen_pp(STR)= = 0){
return_empty_string();
}
如果(AC = 2){
php_strtr_array(return_value,z_strval_pp(STR),z_strlen_pp(STR),hash_of(*));
{人}
convert_to_string_ex(从);
convert_to_string_ex(对);
zval_stringl(return_value,z_strval_pp(STR),z_strlen_pp(STR),1);
php_strtr(z_strval_p(return_value),
z_strlen_p(return_value),
z_strval_pp(从),
z_strval_pp(对),
min(z_strlen_pp(从),
z_strlen_pp(对))))
}
}
首先看php_strtr功能:
复制代码代码如下所示:
/ / trlen是字符串的长度str_from和str_to最小
phpapi char * php_strtr(char * str,int len,char * str_from,char * str_to,int)
{
int i;
unsigned char xlat { 256 }; / /
如果((trlen<1)| |(Len<1)){
返回字符;
}
/ / xlat等于值的下标
为(i = 0;i < 256;xlat {我} =我,我+ +);
从到/到字符串到对应的每个字符。
为(i = 0;i < trlen;i++){
xlat {(unsigned char)str_from {我} } = str_to {我};
}
替换(但感觉这个功能和效率可以提高),因为如果你需要替换的字符只占整个字符串的几个部分,所以有很多的赋值是没有什么意义的,首先确定赋值给的感觉,然后在这种情况下有点感觉。有一个免费的测试。
对于(i = 0;i;;i;+;+){
STR {我} = {(unsigned char)xlat STR {我} };
}
返回字符;
}
可以看出,它应该是有效的处理时,如strtr操作('abcdaaabcd ','ab ','efd)。
(注:此操作输出efcdeeefcd)
再看看php_strtr_array。
复制代码代码如下所示:
静态php_strtr_array(zval * return_value,char * str,int Slen,哈希表的哈希)
{
*输入变量;
char * string_key;
单位string_key_len;
zval **跨;
Zval CTMP;
num_key页;
int市明仁= 128 * 1024;
国际maxlen = 0,POS,Len,发现;
字符*键;
hashposition HPOS;
smart_str结果= { 0 };
哈希表tmp_hash;
/ /替换数组复制到tmp_hash散列,并记录该字符串的最大和最小长度。
zend_hash_init(tmp_hash,0,零,零,0);
zend_hash_internal_pointer_reset_ex(哈希,HPOS);
而(zend_hash_get_current_data_ex(hash(void)进入,HPOS)= =成功){
开关(zend_hash_get_current_key_ex(哈希,string_key,string_key_len,num_key、0、HPOS)){
案例hash_key_is_string:
string_key_len-1 len =;
如果(镜头< 1){
zend_hash_destroy(tmp_hash);
return_false;
}
zend_hash_add(tmp_hash,string_key,string_key_len,入门,sizeof(zval *),null);
如果(Len > maxlen){
maxlen = Len;
}
如果(Len <市明仁){
市明仁= Len;
}
打破;
/ /下标如果是塑料将被转换成一个字符串,例如:数组(10 = > 'AA')为阵列(10'= >AA)
案例hash_key_is_long:
z_type(CTMP)= is_long;
z_lval(CTMP)= num_key;
convert_to_string(CTMP);
len = z_strlen(CTMP);
zend_hash_add(tmp_hash,z_strval(CTMP),len + 1,入门,sizeof(zval *),null);
zval_dtor(CTMP);
如果(Len > maxlen){
maxlen = Len;
}
如果(Len <市明仁){
市明仁= Len;
}
打破;
}
zend_hash_move_forward_ex(哈希,HPOS);
}
关键= emalloc(maxlen + 1);
POS = 0;
从字符串的第一个字符开始循环匹配,POS记录当前的搜索位置。
而(POS < Slen){
当前位置加上最大长度,如果大于字符串长度,则需要更改最大长度。
如果(((POS + maxlen)> Slen){
maxlen = Slen POS;
}
发现= 0;
memcpy(关键,STR + POS,maxlen);
从一开始, / /最大长度of'abcd ',即如果阵列(A = > e、'ab'=>F),是取代AB F第一,而不是代替E.
对于(len = maxlen;len =市明仁;莱恩-){
键{ = } = 0;
因为使用了哈希表,所以效率非常高。
如果(zend_hash_find(tmp_hash,关键,len + 1,反式(void *))= =成功){
char * tval;
Int tlen;
zval TMP;
如果(z_type_pp(反)!= is_string){
反式;
zval_copy_ctor(TMP);
convert_to_string(TMP);
tval = z_strval(TMP);
泰力= z_strlen(TMP);
{人}
tval = z_strval_pp(反);
泰力= z_strlen_pp(反);
}
加入/结果
smart_str_appendl(结果,TVAL泰力);
向前跳
字符集;
发现= 1;
如果(z_type_pp(反)!= is_string){
zval_dtor(TMP);
}
打破;
}
}
如果(!发现){
smart_str_appendc(结果,STR { POS + });
}
}
依芙利特(关键);
zend_hash_destroy(tmp_hash);
smart_str_0(结果);
retval_stringl(结果。C,result.len,0);
}
复制代码代码如下所示:
$ I = 0;
$ T =瞬时(真);
((;$ i < 1000;$ + +)
{
$str = strtr(MD5(为我),$ P2);
}
var_dump(瞬时(真)至T); / / 0.085476875305176
$ T =瞬时(真);
((;$ i < 2000;$ + +)
{
$str = preg_replace(P,'',MD5(我));
}
var_dump(瞬时(真)至T); / / 0.09863805770874
结果表明,strtr效率高于preg_replace约15%。
在一周结束时,strtr的PHP源代码:
复制代码代码如下所示:
php_function(strtr)
{
zval ** STR,**,**;
国际交流= zend_num_args();
/ /检查参数(zend_get_parameters_ex函数定义在zend_api。C文件)
如果(AC 3 | | zend_get_parameters_ex(AC,STR,,到)= =失败){
wrong_param_count;
}
检查参数
如果(AC = = 2 z_type_pp(从)!= is_array){
php_error_docref(空tsrmls_cc,e_warning,第二个参数不是数组。);
return_false;
}
convert_to_string_ex(STR);
空字符串的快捷方式
在zend_operators定义 / / H z_strlen_pp宏。
如果(z_strlen_pp(STR)= = 0){
return_empty_string();
}
如果(AC = 2){
php_strtr_array(return_value,z_strval_pp(STR),z_strlen_pp(STR),hash_of(*));
{人}
convert_to_string_ex(从);
convert_to_string_ex(对);
zval_stringl(return_value,z_strval_pp(STR),z_strlen_pp(STR),1);
php_strtr(z_strval_p(return_value),
z_strlen_p(return_value),
z_strval_pp(从),
z_strval_pp(对),
min(z_strlen_pp(从),
z_strlen_pp(对))))
}
}
首先看php_strtr功能:
复制代码代码如下所示:
/ / trlen是字符串的长度str_from和str_to最小
phpapi char * php_strtr(char * str,int len,char * str_from,char * str_to,int)
{
int i;
unsigned char xlat { 256 }; / /
如果((trlen<1)| |(Len<1)){
返回字符;
}
/ / xlat等于值的下标
为(i = 0;i < 256;xlat {我} =我,我+ +);
从到/到字符串到对应的每个字符。
为(i = 0;i < trlen;i++){
xlat {(unsigned char)str_from {我} } = str_to {我};
}
替换(但感觉这个功能和效率可以提高),因为如果你需要替换的字符只占整个字符串的几个部分,所以有很多的赋值是没有什么意义的,首先确定赋值给的感觉,然后在这种情况下有点感觉。有一个免费的测试。
对于(i = 0;i;;i;+;+){
STR {我} = {(unsigned char)xlat STR {我} };
}
返回字符;
}
可以看出,它应该是有效的处理时,如strtr操作('abcdaaabcd ','ab ','efd)。
(注:此操作输出efcdeeefcd)
再看看php_strtr_array。
复制代码代码如下所示:
静态php_strtr_array(zval * return_value,char * str,int Slen,哈希表的哈希)
{
*输入变量;
char * string_key;
单位string_key_len;
zval **跨;
Zval CTMP;
num_key页;
int市明仁= 128 * 1024;
国际maxlen = 0,POS,Len,发现;
字符*键;
hashposition HPOS;
smart_str结果= { 0 };
哈希表tmp_hash;
/ /替换数组复制到tmp_hash散列,并记录该字符串的最大和最小长度。
zend_hash_init(tmp_hash,0,零,零,0);
zend_hash_internal_pointer_reset_ex(哈希,HPOS);
而(zend_hash_get_current_data_ex(hash(void)进入,HPOS)= =成功){
开关(zend_hash_get_current_key_ex(哈希,string_key,string_key_len,num_key、0、HPOS)){
案例hash_key_is_string:
string_key_len-1 len =;
如果(镜头< 1){
zend_hash_destroy(tmp_hash);
return_false;
}
zend_hash_add(tmp_hash,string_key,string_key_len,入门,sizeof(zval *),null);
如果(Len > maxlen){
maxlen = Len;
}
如果(Len <市明仁){
市明仁= Len;
}
打破;
/ /下标如果是塑料将被转换成一个字符串,例如:数组(10 = > 'AA')为阵列(10'= >AA)
案例hash_key_is_long:
z_type(CTMP)= is_long;
z_lval(CTMP)= num_key;
convert_to_string(CTMP);
len = z_strlen(CTMP);
zend_hash_add(tmp_hash,z_strval(CTMP),len + 1,入门,sizeof(zval *),null);
zval_dtor(CTMP);
如果(Len > maxlen){
maxlen = Len;
}
如果(Len <市明仁){
市明仁= Len;
}
打破;
}
zend_hash_move_forward_ex(哈希,HPOS);
}
关键= emalloc(maxlen + 1);
POS = 0;
从字符串的第一个字符开始循环匹配,POS记录当前的搜索位置。
而(POS < Slen){
当前位置加上最大长度,如果大于字符串长度,则需要更改最大长度。
如果(((POS + maxlen)> Slen){
maxlen = Slen POS;
}
发现= 0;
memcpy(关键,STR + POS,maxlen);
从一开始, / /最大长度of'abcd ',即如果阵列(A = > e、'ab'=>F),是取代AB F第一,而不是代替E.
对于(len = maxlen;len =市明仁;莱恩-){
键{ = } = 0;
因为使用了哈希表,所以效率非常高。
如果(zend_hash_find(tmp_hash,关键,len + 1,反式(void *))= =成功){
char * tval;
Int tlen;
zval TMP;
如果(z_type_pp(反)!= is_string){
反式;
zval_copy_ctor(TMP);
convert_to_string(TMP);
tval = z_strval(TMP);
泰力= z_strlen(TMP);
{人}
tval = z_strval_pp(反);
泰力= z_strlen_pp(反);
}
加入/结果
smart_str_appendl(结果,TVAL泰力);
向前跳
字符集;
发现= 1;
如果(z_type_pp(反)!= is_string){
zval_dtor(TMP);
}
打破;
}
}
如果(!发现){
smart_str_appendc(结果,STR { POS + });
}
}
依芙利特(关键);
zend_hash_destroy(tmp_hash);
smart_str_0(结果);
retval_stringl(结果。C,result.len,0);
}
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。