2009-06-12 24 views
8

Tôi luôn tự hỏi điều này. Tôi có thói quen luôn thêmKhông "sử dụng ...." ở trên đầu trang thêm chi phí cho một kịch bản Perl?

use strict; 
use warnings; 
use Data::Dumper; 

lên đầu mỗi tập lệnh tôi viết. Điều này có thêm chi phí nếu tôi thậm chí không sử dụng chức năng Dumper không? Ngoài ra, trong hầu hết các trường hợp dữ liệu :: Dumper được gọi trước đó trong một gói khác nhưng tôi cần nó trong gói này vì vậy tôi bao gồm nó một lần nữa. Trong trường hợp này, nó có tạo thêm chi phí không?

Trả lời

10

Nếu họ có BEGIN khối hoặc import thường lệ, thì có, nó luôn bổ sung thêm chi phí. Ngoài ra, bất kỳ mã mainline nào đều sẽ được thực thi cuối cùng và bất kỳ các khối INIT, CHECKEND cũng sẽ thực thi.

Cách duy nhất nó sẽ không thêm phí là nếu mô-đun dự kiến ​​use không có gì khác hơn là require. (Tất nhiên, requirecũng chạy tất cả mọi thứ trừ thói quen import, nhưng đó là lý do tại sao tôi đã đề cập xem từ use mô-đun -d. It "hy vọng" là gì, nhưng một đơn giản require.)

Nếu bạn muốn giữ lại dòng đó, vì lý do nào đó, chỉ cần bình luận nó ra. Trong quá trình phát triển, có thể có các mô-đun mà bạn không sử dụng. Trong QA hoặc sản xuất, đó là một sai lầm, IMO.

+1

Nhưng phát triển cũng phải phản ánh sản xuất ở mức có thể. Tôi muốn có một cái gì đó giống như dữ liệu :: Dumper luôn luôn bao gồm hơn chỉ bao gồm trong phát triển. – ysth

+1

Chắc chắn, và đó là lý do tại sao khi bạn kiểm tra nó, nó sẽ có "#use Data :: Dumper;" trong đó. Vì bạn thường xuyên thay đổi mọi thứ trong quá trình phát triển, hãy bỏ ghi chú dòng và bạn nên đi. Nếu bạn muốn nó trở lại như thế nào nó sẽ làm việc trong sản xuất, sau đó bình luận dòng ra một lần nữa. – Axeman

9

Perl phải phân tích mã trong Dumper.pm, vì vậy, chương trình của bạn sẽ khởi động chậm hơn. Đây thường là một hit rất nhỏ để thực hiện. Ngoài ra, bất kỳ mã nào không có chức năng hoặc chức năng nhập sẽ chạy. Điều này có thể có tác động nhỏ đến thời gian khởi động của bạn. Bạn cũng sẽ tiêu thụ nhiều bộ nhớ hơn (AST cho mã và bất kỳ cấu trúc dữ liệu nào mà mã được tạo). Nó không phải là điều tốt nhất bạn có thể làm, nhưng nó là xa tồi tệ nhất. Trừ khi chương trình của bạn rất thường xuyên (nhiều lần một phút), bạn sẽ không nhận thấy bất kỳ cải tiến thực sự về tốc độ bằng cách loại bỏ các dòng.

1

Điều này có thể quan trọng nếu tập lệnh của bạn được thực thi nhiều lần và có thời gian chờ hoặc hạn chế thời gian chạy.

Ví dụ: nếu đó là quy trình được chia nhỏ mỗi khi trang web được hiển thị, bạn có thể muốn giảm thiểu số lượng mã mà bạn phân tích trong khi tải bằng cách xóa các mô-đun không sử dụng.

Hoặc nếu bạn đang chạy perl ở phía bên tay phải của xarg.

Có nhiều cách khác để xóa phí trên đó trong tình huống máy chủ web.

4

Mỗi lần sử dụng tiêu tốn thời gian trước khi tập lệnh của bạn khởi động và có khả năng làm tăng dấu chân bộ nhớ của tập lệnh. Để kiểm tra phí trên, bạn có thể chạy tập lệnh sau:

C:\Temp> cat zzz.pl 
#!/usr/bin/perl 
sleep 10; 

C:\Temp> timethis zzz.pl 
TimeThis : Elapsed Time : 00:00:10.172 

Dấu chân bộ nhớ trong Trình quản lý tác vụ là 2548K.

Bây giờ thêm

use Data::Dumper; 

và thử nghiệm một lần nữa:

TimeThis : Elapsed Time : 00:00:10.266 

Lần này, bộ nhớ là 3408K. Vì vậy, bạn lãng phí thời gian và một số bộ nhớ nếu mô-đun bạn sử dụng không thực sự được sử dụng.

Thời gian khởi động quan trọng trong tập lệnh được gọi lặp lại (như CGI) và các vấn đề về bộ nhớ, trong số các trường hợp khác, trong các tập lệnh và tập lệnh chạy dài.

1

Nếu bạn yêu cầu bạn không nhớ nó. Có, nó cho biết thêm một số chi phí. Mã số:

use Data::Dumper; 

tương đương gần như chính xác của:

BEGIN { 
    require Data::Dumper; 
    Data::Dumper->import(); 
} 

Điều đó có nghĩa, rằng mô-đun trong thời gian biên dịch Data :: Dumper được phân tách và cơ thể thực hiện trừ khi nó đã không thực hiện được nêu ra. Nó có nghĩa là nếu bạn có nhiều mô đun và sử dụng Data :: Dumper trong mỗi chi phí này chỉ xảy ra một lần. Kiểm tra yêu cầu đã thực hiện rất nhanh, rất nhanh. Dòng thứ hai thực hiện cuộc gọi nhập và nó sẽ cài đặt nhập vào không gian tên gói hiện tại (thu được bởi người gọi). Phải mất một thời gian trong tất cả các mô-đun được sử dụng. Nếu bạn muốn tránh nó sử dụng:

use Data::Dumper(); 

Hơn bạn không thể gọi Dumper() nhưng bạn phải sử dụng Data::Dumper::Dumper(). Tôi thích sử dụng Data::Dumper->Dump([vars], [names]) mang lại cho tôi sản lượng mà tôi thích hơn.

0

Đây không phải là những gì bạn đã hỏi, nhưng tôi thấy dựa vào dữ liệu :: Dumper là một cái nạng và một thói quen đáng để phá vỡ. Vì perl tuân theo triết lý giả định mã đồng là thân thiện hơn là độc hại, nó rất hấp dẫn đối với lập trình viên cho dữ liệu :: Dump một đối tượng mờ để khám phá cách nội bộ của nó được lưu trữ, và sau đó truy cập trực tiếp cung cấp giao diện. Dữ liệu :: Dumper là một trong những lý do tại sao các đối tượng Inside-Out được tạo ra - để làm cho nó khó hơn/không thể cho những người lập trình thiếu kiên nhẫn nhưng thiếu kiên nhẫn trong việc tìm kiếm xung quanh thông qua internals.

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