回顾一下上篇。在PHP编程中,对比数组的值是一个很常见的需求,这个时候将其值与键反转的确比通常的值对值的比较效率要高得多。第三个函数仅仅判断这个数组是否存在该键就可以了(反转数组也就循环一次,还可以把重复元素剔除),加上数组键和值不同的组织索引方式,效率比原生的还高那就非常可以理解了。

与查找一样,遍历也是数组很常见的操作之一。那么遍历是否也会因为PHP的数组是哈希表而有不同的效率呢?那么我们先来像上一篇一样,做个性能试验吧。

下面是array_walk 和 foreach, for 效率比较的小程序。

  1. /**
  2. * array_walk 和 foreach, for 的效率的比较。
  3. * 我们要测试的是foreach, for, 和 array_walk的效率的问题。
  4. */
  5.  
  6. //产生一个10000的一个数组。
  7. $max = 10000;
  8. $test_arr = range(0, $max);
  9. $temp = \'\';
  10. //我们分别用三种方法测试求这些数加上1的值的时间。
  11. // for 的方法
  12. $t1 = microtime(true);
  13. for ($i = 0; $i < $max; $i++) {
  14. $temp = $temp + 1;
  15. }
  16. $t2 = microtime(true);
  17. $t = $t2 - $t1;
  18. echo "就使用for, 没有对数组操作 花费: {$t}".\'<br />\';
  19. $t1 = microtime(true);
  20. for ($i = 0; $i < $max; $i++) {
  21. $test_arr[$i] = $test_arr[$i] + 1;
  22. }
  23. $t2 = microtime(true);
  24. $t = $t2 - $t1;
  25. echo "使用for 并且直接对数组进行了操作 花费: {$t}".\'<br />\';
  26. $t1 = microtime(true);
  27. for ($i = 0; $i < $max; $i++) {
  28. addOne($test_arr[$i]);
  29. }
  30. $t2 = microtime(true);
  31. $t = $t2 - $t1;
  32. echo "使用for 调用函数对数组操作 花费 : {$t}".\'<br />\';
  33. $t1 = microtime(true);
  34. foreach ($test_arr as $k => &$v) {
  35. $temp = $temp + 1;
  36. }
  37. $t2 = microtime(true);
  38. $t = $t2 - $t1;
  39. echo "使用 foreach 没有对数组操作 花费 : {$t}".\'<br />\';
  40. $t1 = microtime(true);
  41. foreach ($test_arr as $k => &$v) {
  42. $v = $v + 1;
  43. }
  44. $t2 = microtime(true);
  45. $t = $t2 - $t1;
  46. echo "使用 foreach 直接对数组操作 : {$t}".\'<br />\';
  47. $t1 = microtime(true);
  48. foreach ($test_arr as $k => &$v) {
  49. addOne($v);
  50. }
  51. $t2 = microtime(true);
  52. $t = $t2 - $t1;
  53. echo "使用 foreach 调用函数对数组操作 : {$t}".\'<br />\';
  54. $t1 = microtime(true);
  55. array_walk($test_arr, \'addOne\');
  56. $t2 = microtime(true);
  57. $t = $t2 - $t1;
  58. echo "使用 array_walk 花费 : {$t}".\'<br />\';
  59. function addOne(&$item) {
  60. $item = $item + 1;
  61. }

程序运行结果为(为方便比较,更改一下顺序):

  1. 使用 for, 没有对数组操作 花费: 0.0030920505523682
  2. 使用 foreach 没有对数组操作 花费 : 0.0021021366119385
  3. 使用 for 并且直接对数组进行了操作 花费: 0.0043869018554688
  4. 使用 foreach 直接对数组操作 花费: 0.0026419162750244
  5. 使用for 调用函数对数组操作 花费 : 0.28954601287842
  6. 使用 foreach 调用函数对数组操作 : 0.27538895606995
  7. 使用 array_walk 花费 : 0.30511689186096

在对10000个数的操作过程中,这个实验我们可以得出这样的结论:foreach 的效率要比for 高很多,也许有很大的一个原因是for 要进行很多次条件判断。所以以后能用foreach的地方就用foreach,可以提高大约1倍的效率。

在试验中,array_walk() 调用函数比其余两者要慢一点点。但这个不是我们现在关心的内容,现在我们需要关注的是 for 和 foreach 性能的比较。除去上面说到的, for 需要多次条件判断之外, foreach 还有什么地方让它的效率如此之高?后面会慢慢剖析开来

转载:http://www.nowamagic.net/academy/detail/1204408

版权声明:本文为anyongchao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/anyongchao/p/3903496.html