2013-01-14 39 views
9

Tôi có một tập lệnh được viết bằng PHP và cùng một tập lệnh được viết bằng Javascript.
Nó lặp lại hàng triệu lần và mỗi lần dải một chuỗi thành một mảng và gán mục mảng đầu tiên vào một biến mới.Mức tiêu thụ bộ nhớ trên tập lệnh lặp

Các PHP là:

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(); 

Và Javascript là:

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(); 

tôi chạy PHP với PHP-CLI 5.3.10 và Javascript với nút v0.6.12.

Đối với PHP tôi sử dụng 'memory_get_usage()' và cho Javascript tôi sử dụng 'process.memoryUsage()'. Tôi chạy chúng ở đầu của kịch bản, sau đó ở cuối, sau đó kết thúc trừ với bắt đầu và cuối cùng chuyển đổi số byte thành mb.

PHP sử dụng 0,00065 MB bộ nhớ trong khi Javascript sử dụng 0,25 mb tuy nhiên PHP mất 4 giây và Javascript mất 0,71 giây. Tôi đã chạy kết quả trên 2 máy khác nhau.

Có ai biết tại sao việc sử dụng bộ nhớ Javascript sẽ cao hơn rất nhiều so với PHP (mặc dù thực tế Javascript được thực hiện nhanh hơn rất nhiều)?

Giải thích duy nhất tôi có thể đưa ra là bản chất của V8 để sử dụng các lớp ẩn cải thiện tốc độ nhưng tăng mức tiêu thụ bộ nhớ.

+1

chỉ cần lưu ý: các tập lệnh không giống nhau. các vars bên trong chức năng php là riêng tư, trong js là globals. –

+1

Ví dụ kiểm tra của bạn không giống như chúng có thể. Trong JavaScript Bạn nên áp dụng phương thức Iterate của bạn như là một phần của đối tượng nguyên mẫu đầu tiên ... theo cách đó bạn không tạo lại phương thức trên mỗi lần thực hiện (gần với cách thức hoạt động của php). – Pebbl

+1

@pebbl cảm ơn. Một cái gì đó như First.prototype.Iterate = function() –

Trả lời

1

Vì chúng là các môi trường thực thi rất khác nhau.

Trong trường hợp của PHP, nguồn được chuyển đổi thành một loạt các mã - loại giống như p-code, trong khi v8 sử dụng trình biên dịch JIT. Sau đó sẽ có xu hướng profilgate hơn với việc sử dụng bộ nhớ, tuy nhiên tôi nghi ngờ sự khác biệt lớn nhất giữa 2 cho sử dụng bộ nhớ được do các chính sách khác nhau cho thu gom rác thải:

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

test_array = test_string.split(" "); 

tạo đối tượng trên ngăn xếp được hủy bỏ ở cuối mỗi lần lặp lại.

Không cung cấp nhiều quyền truy cập để kiểm soát việc sử dụng bộ nhớ thời gian chạy.

+0

cảm ơn, sẽ sửa đổi var địa phương để khác nhau của nó cho mỗi lần lặp lại và xem những gì mà sản xuất như Stack sẽ tăng lên ngay bây giờ. –

Các vấn đề liên quan