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ớ.
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. –
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
@pebbl cảm ơn. Một cái gì đó như First.prototype.Iterate = function() –