php扩展返回字符数组,PHP扩展之数组字符串处理
今天介紹一下PHP擴展來處理數(shù)組和字符串,附帶一個對比原生PHP的處理效率:
我的測試機是裝的PHP5.6.12,實現(xiàn)下面這個功能:function?phprandstr($a,?$z,?$n)?{
$b?=?array();
$max?=?count($a);
for?($i?=?0;?$i?
$tmp?=?"";
for?($j?=?0;?$j?
$zix?=?mt_rand(0,?($max?-?1));
$tmp.=$a[$zix];
}
array_push($b,?$tmp);
}
return?$b;
}
很簡單對不對,對一個數(shù)組里面的字符,隨機取出來拼接,然后push到一個新的數(shù)組,下面來看PHP擴展的實現(xiàn):
繼續(xù)在我之前那個ligphp擴展里面寫,編輯php_ligphp.h,添加一個randStr()函數(shù):PHP_FUNCTION(randStr);
然后我們來重點看一下ligphp.c里面的代碼:PHP_FUNCTION(randStr)?{
zval?*arr,?**data;
long?z;
long?n;
int?i,?j,?zix;
char?*s?=?NULL,?*str;
HashTable?*?arr_hb;
if?(zend_parse_parameters(ZEND_NUM_ARGS()?TSRMLS_CC,?"all",?&arr,?&z,?&n)?==?FAILURE)?{
RETURN_NULL();
}
arr_hb?=?Z_ARRVAL_P(arr);
long?length?=?zend_hash_num_elements(arr_hb);
if?(z?>?length)?{
php_error_docref(NULL?TSRMLS_CC,?E_NOTICE,?"參數(shù)二不能超過數(shù)組長度");
RETURN_NULL();
}
array_init_size(return_value,?n);
for?(i?=?0;i?
str?=?(char?*)malloc(z?+?1);
memset(str,?'\0',?z?+?1);
for(j?=?0;j?
zix?=?php_rand()?%?length;
if(zend_hash_index_find(arr_hb,?zix,?(void?**)&data)==?FAILURE)?{
return;
}
s?=?Z_STRVAL_PP(data);
strncat(str,?s,?strlen(s));
}
add_index_string(return_value,?i,?str,?1);
}
return;
};
解釋下上面的代碼;
1.我們首先用zend_parse_parameters()函數(shù)接收參數(shù),可以看到,接收一個數(shù)組類型的zval結(jié)構(gòu)arr,2個long整型z和n;
2.用Z_ARRVAL_P宏,取出arr的值賦給哈希表結(jié)構(gòu)類型的arr_hb,用zend_hash_num_elements()函數(shù)獲取hashtable的長度便于下面的驗證和算法處理;
3.用array_init_size()函數(shù)初始化return_value為一個數(shù)組;
4.開始循環(huán)處理,這里代碼比較簡單,用到的2個C函數(shù)malloc()動態(tài)分配內(nèi)存空間和memset()把str的內(nèi)存地址中沒一個字節(jié)都設置成'\0'空字符串,即NULL;
5.zend_hash_index_find()函數(shù)是用于數(shù)字型索引數(shù)組的查找,strncat()是C函數(shù)用于拼接字符串的,add_index_string()函數(shù)類似PHP的array_push(),只不過是要指定index的。
把randStr注冊到函數(shù)表中然后編譯,接下來,我們來做一個簡單測試,從26個英文字母里面隨機取50000個10位的字符串,對比PHP執(zhí)行和PHP擴展執(zhí)行的效率:$a?=?array("a",?"b",?"c",?"d",?"e",?"f",?"g",?"h",?"i",?"j",?"k",?"l",?"m",?"n",?"o",?"p",?"q",?"r",?"s",?"t",?"u",?"v",?"w",?"x",?"y",?"z");
$t1?=?microtime(true);
//$b=phprandstr($a,10,50000);
$b?=?randStr($a,?10,?50000);
$t2?=?microtime(true);
echo?"耗時:"?.?($t2?-?$t1)?.?"\n";
在我的機器上實測PHP處理需要0.162毫秒,PHP擴展處理0.032毫秒,相差大概五倍,可能毫秒級的你不在乎,但是想想,一次請求讓你等1秒,你可以接受,讓你等五秒,你估計炸毛了。。。
打賞
微信掃一掃,打賞作者吧~
總結(jié)
以上是生活随笔為你收集整理的php扩展返回字符数组,PHP扩展之数组字符串处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Echarts+HTML5可视化数据
- 下一篇: python自定义函数func_pyth