内存消耗迭代脚本
我有用PHP编写的脚本和用Javascript编写的相同的脚本。
它迭代一百万次,每次将一个string剥离到一个数组中,并将第一个数组项赋给一个新的variables。
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()'。 我在脚本的开始处运行它们,然后在最后,然后减去结束,最后将字节数转换为mb。
PHP使用0.00065 mb的内存,而JavaScript使用0.25 mb,但PHP需要4秒,JavaScript需要0.71秒。 我已经在2个不同的机器上运行结果。
有谁知道为什么Javascript的内存使用率会比PHP高很多(尽pipeJavascript的执行速度非常快)。
我能想出的唯一解释是V8的本质使用隐藏类提高了速度,但增加了内存消耗。
因为它们是非常不同的执行环境。
在PHP的情况下,源代码被转换成一系列的操作码 – 类似于p代码,而v8使用JIT编译器。 后者将更倾向于内存使用的profilgate,但是我怀疑内存使用的2之间的最大区别是由于不同的垃圾收集策略:
$test_array = split(" ", $test_string);
和
test_array = test_string.split(" ");
在堆栈上创build一个在每次迭代结束时被丢弃的对象。
既不提供太多的访问来控制运行时的内存使用情况。