Tôi đã viết một trình phân tích tệp trong Perl, vì vậy phải lặp qua tệp. Tệp bao gồm các bản ghi độ dài cố định và tôi muốn tạo một hàm riêng biệt phân tích bản ghi đã cho và gọi hàm đó trong một vòng lặp. Tuy nhiên, kết quả cuối cùng đã trở nên chậm chạp với các tệp lớn và dự đoán của tôi là tôi không nên sử dụng chức năng bên ngoài. Vì vậy, tôi đã làm một số xét nghiệm giả có và không có lời gọi hàm trong một vòng lặp:tại sao các cuộc gọi hàm trong vòng lặp Perl quá chậm?
[A]
foreach (1 .. 10000000) {
$a = &get_string();
}
sub get_string {
return sprintf("%s\n", 'abc');
}
[B]
foreach (1 .. 10000000) {
$a = sprintf "%s\n", 'abc';
}
đo cho thấy Mã chạy khoảng 3-4 lần chậm hơn mã B. Tôi biết trước rằng mã A được cho là chạy chậm hơn nhưng tôi vẫn ngạc nhiên rằng sự khác biệt là lớn. Cũng cố gắng chạy thử nghiệm tương tự với Python và Java. Trong mã Python Một tương đương chậm hơn khoảng 20% so với mã B và Java được chạy nhiều hơn hoặc ít hơn ở cùng tốc độ (như mong đợi). Thay đổi chức năng từ sprintf sang một cái gì đó khác đã không hiển thị bất kỳ sự khác biệt đáng kể.
Có cách nào giúp Perl chạy vòng lặp nhanh hơn không? Tôi đang làm một cái gì đó totaly sai ở đây hoặc là tính năng của Perl rằng các cuộc gọi chức năng là chi phí như vậy?
gì, chính xác, không get_string() làm gì? – eruciform
@roe Chúng tôi giả định rằng đó là một sơ khai và bạn đã không sử dụng 'sprintf' chỉ để dính một dòng mới vào một chuỗi liên tục. Đó sẽ là ngớ ngẩn. Vậy nó thực sự làm gì? – Schwern
lạ, màn hình của tôi được định dạng kỳ lạ, nó không ở trên đó trước đây. firefox goof .. – eruciform