Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 这是一种公平的算法比较方法吗?_Php - Fatal编程技术网

Php 这是一种公平的算法比较方法吗?

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

我想把数组转换成小写,想知道最有效的方法是什么。我提出了两个选项,一个使用array_walk,另一个使用foreach,并希望对它们进行比较。这是比较两者的最好方法吗?有没有一种我忽略了的更有效的方法

<?
$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。当然,如果您认为这很重要,您应该在实际应用程序中测试它。合成基准测试很有趣,但最终毫无用处

另外,要更改数组键,可以使用

  • -更改数组中的所有键

为什么不使用:数组\u映射('strtolower',$input\u数组);要么在填充数组时将所有内容都小写,要么在其他地方使用原始大小写,重写任何需要小写的比较函数以忽略大小写。这很奇怪,我刚刚在完全随机的数据上测试了array\u map vs foreach,array\u map要快得多。。。在Windows上使用PHP5.2.13(速度是原来的两倍多)。顺便说一句,你正在用1个随机值填充数组(而不是用完全随机的字符串填充它们)。只需重新测试,就可以用我给出的方法映射数组,而且速度更快。感谢您的测试和指出。为什么不使用:array\u map('strtolower',$input\u array);要么在填充数组时将所有内容都小写,要么在其他地方使用原始大小写,重写任何需要小写的比较函数以忽略大小写。这很奇怪,我刚刚在完全随机的数据上测试了array\u map vs foreach,array\u map要快得多。。。在Windows上使用PHP5.2.13(速度是原来的两倍多)。顺便说一句,你正在用1个随机值填充数组(而不是用完全随机的字符串填充它们)。只需重新测试,就可以用我给出的方法映射数组,而且速度更快。谢谢你的测试和指出。谢谢你的建议,但是这个方法会比其他方法占用更多的内存。不用担心。你应该在问题中提到内存限制。效率,当不合格时,通常被视为平均速度。公平地说,它也较慢谢谢你的建议,不过这个方法会比其他方法占用更多的内存。不用担心。你应该在问题中提到内存限制。效率,当不合格时,通常被视为平均速度。公平地说,它也较慢谢谢,我不知道ab实用程序,似乎正是我所需要的。ab对于此类测试非常有用,因为您可以设置执行测试的次数和并发级别,并获得整个结果集的详细统计明细,让您也可以查看差异。谢谢,我不知道ab实用程序,似乎正是我需要的。ab对于这种测试非常有用,因为