9

我有一个用 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 减去 end,最后将字节数转换为 mb。

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

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

我能想到的唯一解释是 V8 使用隐藏类的特性提高了速度但增加了内存消耗。

4

1 回答 1

1

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

对于 PHP,源代码被转换为一系列操作码——有点像 p 代码,而 v8 使用 JIT 编译器。后者往往更倾向于使用内存,但是我怀疑 2 之间内存使用的最大差异是由于垃圾收集的不同策略:

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

test_array = test_string.split(" ");

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

两者都没有提供太多控制运行时内存使用的访问权限。

于 2013-01-14T17:09:40.453 回答