【问题标题】:PHP - Many variables or One array?PHP - 许多变量或一个数组?
【发布时间】:2012-12-29 13:10:01
【问题描述】:

我有一个问题,哪个更快...

  1. 我制作了许多包含我所有数据的变量,
  2. 我在一个变量中创建一个数组,其中包含我的所有数据并访问它

【问题讨论】:

  • 你有什么样的数据?
  • 主要是在需要通过key动态引用元素的时候使用数组,所以它们有不同的用法
  • 最好不要担心 php imo 的这种优化水平。在处理脚本语言时,您应该更多地关注什么可以帮助您以可读和明智的方式完成工作。数组是为包含大量相似数据而设计的,并且更容易在函数之间移动。关于访问速度,我会说单个变量更快,但它们会使您的代码更难处理,特别是如果需要将数据保存为一个组。
  • 这可能取决于您访问阵列的方式。整数索引比哈希映射快。

标签: php arrays variables


【解决方案1】:

许多变量比数组快,主要是因为数组是有序映射 (http://php.net/manual/en/language.types.array.php),因此根据数组中每个值的定义,还分配了数组中值的引用键。 这会消耗额外的内存,并且在谈到数组中的数十万条记录时会产生重大影响。 性能随着记录数量的增加而降低。 这种开销可以通过使用标量变量而不是数组来避免。

最近我正在开发一个分析器,以使用刻度回调来测量内存和执行时间。 起初,我使用一个数组来记录事件并跟踪每个滴答间隔的所有测量值。 将这些值放在单独的标量变量而不是数组中后,我发现性能显着提高(分别在 10 - 20% 之间,100000 - 1000000 条记录)。

但是,当一个数组只有几条记录时,与标量变量的区别是没有的,性能应该不是问题。 在这种情况下,数组可能更适合这种情况并更有效,提高可读性、维护性等。

【讨论】:

    【解决方案2】:

    简短:访问变量更快。

    但您仍然可以使用数组,因为 code quality 更好。为了获得更好的性能,请使用缓存。无论如何,您应该在性能问题发生时处理它们!

    阵列测试

    $n = 1000000;
    $startTime = microtime(true);  
    for ($i = 0; $i <= $n; $i++)
    {
        $x = $a[1];
    }
    $endTime = microtime(true);  
    $elapsed = $endTime - $startTime;
    echo "Array: $elapsed seconds";
    

    变量测试

    $startTime = microtime(true);  
    
    for ($i = 0; $i <= $n; $i++)
    {
        $x = $v;
    }
    $endTime = microtime(true);  
    $elapsed = $endTime - $startTime;
    echo "Variable : $elapsed seconds";
    

    结果

    数组:0.092 秒

    变量:0.064 秒

    使用带有字符串作为索引的数组的节点也会慢得多(哈希图)。比较 zend_hash_findzend_hash_index_find

    如果我使用$a = array_fill( 0, 1000, 1 );$x = $a2[999];,数组的大小并没有真正的区别

    内存

    不问但有趣的是内存使用情况。所以我创建了一个包含 10000 个元素和 10000 个变量的数组。

    $a = array();
    for ($i = 0; $i <= 10000; $i++)
    {
        // one array
        eval('$a[] = "test";'); // 3454128
        // Variables
        //eval('$a' . $i. ' = "test";'); // 3552360
    }
    print_r(memory_get_usage());
    

    数组:3454128

    变量:3552360

    所以数组确实使用的内存略少。

    【讨论】:

    • 即使数组速度较慢。这并不意味着它们总是更快。如果将数组中的 100 个项发送到函数或 100 个变量会发生什么?
    • @Laurence What will happen if you send to function 100 variables? 有人会被解雇吗? :) 但是如果说真的 - 这是一个好问题,即使它根本不应该上升,因为制作这样的函数很糟糕(我在我的一个项目中发现了一个有超过 50 个参数的函数 - 这太疯狂了!在那里做修改很害怕我到死)
    • @FAngel 你应该为此提出一个新问题;)
    【解决方案3】:

    这里的人说数组更快。但数组也是变量。如果您使用数组 - 您仍然需要像访问任何变量一样访问它,此外您还需要访问数组中的项目。因此,在我看来,将数组用作变量存储并不是最好的主意。

    另外 - 数组用于存储一些数组数据。例如,类别 id => 类别名称对。

    $catId1 = "Category 1";
    $catId2 = "Category 2";
    $catId3 = "Category 3";
    

    上面的代码会……很奇怪。您正在失去数组的许多功能,例如,无法遍历 for 循环中的所有类别。因此,对于数组数据 - 数组就是您所需要的。

    一旦你有不同类型的数据(谈论该数据的含义,而不是它的类型,如整数或字符串),你应该更好地使用变量:

    $requested_category = 1;
    $requested_category_name = "Some category";
    $category_processing_result = "Ok"; 
    

    而不是数组:

    $varsArray['requested_category'] = 1;
    $varsArray['requested_category_name'] = "Some category";
    $varsArray['category_processing_result'] = "Ok"; 
    

    使用变量,任何 IDE 都可以帮助您编写这些名称,这样的代码更易于阅读和支持。这对我来说更重要。

    即使它们以某种方式变慢或占用更多内存 - 就速度/内存使用而言,这肯定不是最糟糕的问题。

    【讨论】:

    • 代码质量确实更值钱。
    【解决方案4】:

    试一试:)

    测试 1

    有 5 个变量

    $myvar1 = 'hello';
    $myvar2 = 'hello';
    $myvar3 = 'hello';
    $myvar4 = 'hello';
    $myvar4 = 'hello';
    
    print_r(memory_get_usage());
    

    结果:618600

    测试 2

    有 5 个数组键

    $myvar = array();
    $myvar['var1'] = 'hello';
    $myvar['var2'] = 'hello';
    $myvar['var3'] = 'hello';
    $myvar['var4'] = 'hello';
    $myvar['var5'] = 'hello';
    
    print_r(memory_get_usage());
    

    结果:620256

    【讨论】:

    • 这个答案很详细!
    • 你只描述它使用更多的内存。并不是说他们更快。 +1 内存概览;)。
    • 我只想指出,0.2% 的内存消耗差异并没有显示出任何差异。您需要查看 CPU 使用情况而不是内存消耗。您还需要对通过这些值等进行基准测试。
    • confirmed 那些包含 10000 个变量的结果。
    • @Laurence 来晚了,但我现在才到这里,我必须创建 1500 个变量或相同大小的数组,但这个答案证明数组会消耗更多内存,多少取决于键结构( int 或 String),因此单个变量引用速度很快。
    【解决方案5】:

    将所有数据存储在一个数组中可能会更快,具体取决于您处理数据的方式。我建议将彼此关系密切的每组数据分组到一个数组中。

    希望这会有所帮助。

    【讨论】:

      【解决方案6】:

      将所有相关数据放在一个数组中,数组更快。

      【讨论】:

      • 他们也认为地球是平的。可以加证明吗?
      • @DinoBabu 这有助于说明哪种方法需要更多内存。但没有说明速度。并不是说我知道数组比变量慢,但对我来说 - 它们不应该更快,我想知道我是否错了。
      猜你喜欢
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      相关资源
      最近更新 更多