Php 这是一种公平的算法比较方法吗?
我想把数组转换成小写,想知道最有效的方法是什么。我提出了两个选项,一个使用array_walk,另一个使用foreach,并希望对它们进行比较。这是比较两者的最好方法吗?有没有一种我忽略了的更有效的方法Php 这是一种公平的算法比较方法吗?,php,Php,我想把数组转换成小写,想知道最有效的方法是什么。我提出了两个选项,一个使用array_walk,另一个使用foreach,并希望对它们进行比较。这是比较两者的最好方法吗?有没有一种我忽略了的更有效的方法 <? $a = array_fill(0, 200000, genRandomString()); $b = array_fill(0, 200000, genRandomString()); $t = microtime(true); array_walk($a, create_func
<?
$a = array_fill(0, 200000, genRandomString());
$b = array_fill(0, 200000, genRandomString());
$t = microtime(true);
array_walk($a, create_function('&$a', '$a = strtolower($a);'));
echo "array_walk: ".(microtime(true) - $t);
echo "<br />";
$t = microtime(true);
foreach($b as &$source) { $source = strtolower($source); }
echo "foreach: ".(microtime(true) - $t);
function genRandomString($length = 10) {
$characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
$string = '';
for ($p = 0; $p < $length; $p++) {
$string .= $characters[mt_rand(0, strlen($characters)-1)];
}
return $string;
}
我不懂PHP,所以这是一个猜测:
str_split(strtolower(implode("", $a)))
我不懂PHP,所以这是一个猜测:
str_split(strtolower(implode("", $a)))
两个问题合一
如何运行测试:
ab -n 100 -c 1 http://localhost/arrayWalkTest.php
ab -n 100 -c 1 http://localhost/foreachTest.php
就我个人而言,我会为每个方法编写单独的测试脚本,然后使用Apache ab实用程序运行测试:
ab -n 100 -c 1 http://localhost/arrayWalkTest.php
ab -n 100 -c 1 http://localhost/foreachTest.php
这为我提供了一组更详细的统计数据进行比较
我还试图确保这两种方法在每个测试中使用相同的数据集,而不是不同的随机数据
最有效的方法是:
作为一项安全措施,您应该在循环后取消设置($source):因为您在循环中通过引用进行访问,$source仍将包含对数组中最后一个条目的引用,如果您在脚本中的任何其他位置引用$source,可能会给您带来不可预知的结果。一问两题
如何运行测试:
ab -n 100 -c 1 http://localhost/arrayWalkTest.php
ab -n 100 -c 1 http://localhost/foreachTest.php
就我个人而言,我会为每个方法编写单独的测试脚本,然后使用Apache ab实用程序运行测试:
ab -n 100 -c 1 http://localhost/arrayWalkTest.php
ab -n 100 -c 1 http://localhost/foreachTest.php
这为我提供了一组更详细的统计数据进行比较
我还试图确保这两种方法在每个测试中使用相同的数据集,而不是不同的随机数据
最有效的方法是:
作为一项安全措施,您应该在循环后取消设置($source):因为您是通过循环中的引用进行访问的,$source仍将包含对数组中最后一个条目的引用,如果您在脚本中的任何其他位置引用$source,可能会给您带来不可预测的结果。我过去使用
microtime
方法而不是使用专用的探查器时,会产生很多奇怪的结果,就像XDebug或Zend_调试器中存在的那样。此外,为了公平比较,数组应该是相同的,而不是两个随机数组
此外,可以考虑使用和:
这将为您节省array\u walk
的lambda。使用create_function
(不像)创建的匿名函数速度较慢,而且strtolower
是本机函数,因此直接使用它应该更快
我做了一个快速的基准测试,我看不出这种方法和您的foreach
之间有任何相关的速度差异。就像很多时候一样,我会说这是一个µ-opt。当然,如果您认为这很重要,您应该在实际应用程序中测试它。合成基准测试很有趣,但最终毫无用处
另外,要更改数组键,可以使用
- -更改数组中的所有键
微时间
方法而不是使用专用的探查器时,会产生很多奇怪的结果,就像XDebug或Zend_调试器中存在的那样。此外,为了公平比较,数组应该是相同的,而不是两个随机数组
此外,可以考虑使用和:
这将为您节省array\u walk
的lambda。使用create_function
(不像)创建的匿名函数速度较慢,而且strtolower
是本机函数,因此直接使用它应该更快
我做了一个快速的基准测试,我看不出这种方法和您的foreach
之间有任何相关的速度差异。就像很多时候一样,我会说这是一个µ-opt。当然,如果您认为这很重要,您应该在实际应用程序中测试它。合成基准测试很有趣,但最终毫无用处
另外,要更改数组键,可以使用
- -更改数组中的所有键