迭代脚本上的内存消耗

时间:2013-01-14 14:04:10

标签: javascript node.js memory php

我有一个用PHP编写的脚本和用Javascript编写的相同脚本 它迭代了一百万次,每次都将一个字符串剥离成一个数组,并将第一个数组项分配给一个新的变量。

PHP是:

class First
{
public function Iterate()
{
    $count = 1000000; 
    $test_string = '';
    $test_array = '';
    $first_word = '';
    for($i=1; $i <= $count; $i++){
        $test_string = 'This is a test string';
        //could use explode but no explode in js
        $test_array = split(" ", $test_string);
        $first_word = $test_array[0];
    }
}
}
$first = new First();
$first->Iterate();

Javascript是:

function First() {
this.Iterate = function() {
    count = 1000000;
    test_string = '';
    test_array = '';
    first_word = '';
    for(var i=1;i <= count; i++){
                    test_string = 'This is a test string';
                    test_array = test_string.split(" ");
                    first_word = test_array[0];
    }
}
}
first = new First();
first.Iterate();

我使用PHP-CLI 5.3.10运行PHP,使用节点v0.6.12运行Javascript。

对于PHP我使用'memory_get_usage()'而对于Javascript我使用'process.memoryUsage()'。我在脚本开始时运行它们,然后在结束时运行它们,然后在start结束时运行它们,最后将字节数转换为mb。

PHP使用0.00065 mb的内存,而Javascript使用0.25 mb但PHP需要4秒,而Javascript需要0.71秒。我已经在两台不同的机器上运行了结果。

有人知道为什么Javascript内存使用量会比PHP高得多(尽管Javascript的执行速度要快得多)?

我能想到的唯一解释是V8使用Hidden类的本质可以提高速度,但会增加内存消耗。

1 个答案:

答案 0 :(得分:1)

因为它们是非常不同的执行环境。

在PHP的情况下,源被转换为一系列操作码 - 有点像p代码,而v8使用JIT编译器。后者将更倾向于使用内存,但我怀疑2内存使用的最大区别是由于不同的垃圾收集策略:

$test_array = split(" ", $test_string);

test_array = test_string.split(" ");

在堆栈上创建一个对象,在每次迭代结束时将其丢弃。

两者都没有提供对控制运行时内存使用的大量访问权。