我有一个语言文件,其中包含一个大约3k行的数组$phrases
。
$phrases = array();
$phrases['hello'] = 'bonjour';
我创建了一个从这个数组中检索值的函数。
function phrase($identifier) {
global $phrases;
return $phrases['identifier'];
}
我使用如下:
function some_view() {
$intro = phrase('hello') . $firstname;
}
如何在语言文件随时间增长的情况下优化此代码以保证性能?
答案 0 :(得分:2)
使用数组的本地化既简单又快速,但它缺乏您将来可能需要的一些功能(例如处理日期格式,货币或复数)。
这里有一个article,可以很好地解释你的可能性,你可以认为哪一个更适合你的项目。
就个人而言,如果项目足够大,我总是坚持使用Symfony的Translator组件:http://symfony.com/doc/current/components/translation.html
答案 1 :(得分:1)
您将为这大量语言行支付的代价可能会在编译/运行时进行评估,而不是在语言字符串查找操作期间进行评估。如果您想对其进行优化,我建议您将语言字符串拆分为较小的部分或其他内容,并仅根据需要加载每个部分。
我做了一些测试。只是为数组赋值不需要花费太多时间。此函数生成随机$ key值并指定关联数组$ key => $ key一些次。
function get_str() {
$retval = "";
for($j=0; $j<10; $j++) {
$retval .= chr(mt_rand(ord("A"), ord("Z")));
}
return $retval;
}
$arr = array();
$el1 = 0;
for($i=0; $i<1000000; $i++) {
$key = get_str();
$start = microtime(TRUE);
$arr[$key] = $key;
$el1 += (microtime(TRUE) - $start);
}
var_dump($el1);
结果:
10 elements 1.1920928955078E-5
100 elements 9.4175338745117E-5
1,000 elements 0.00090622901916504 // less than a millisecond
1,000,000 elements 1.0554702281952
这不是一个非常重的惩罚。我添加了一些代码来执行1,000次查找:
$el2 = 0;
for($i=0; $i<1000; $i++) {
$lookup = get_str();
$start = microtime(TRUE);
$val = (isset($arr[$lookup]) ? $arr[$lookup] : "");
$el2 += (microtime(TRUE) - $start);
}
var_dump($el2);
我将数组中的元素数量从10变为1,000,000,并在每个数组大小上执行1,000次查找。结果:
10 elements 0.00072717666625977
100 elements 0.00070691108703613
1000 elements 0.00071167945861816 // less than a millisecond
1,000,000 elements 0.0008540153503418 // still less than a millisecond
如您所见,关联哈希查找保持高效,即使对于非常大的数据结构也是如此