2009-03-18 38 views
38
my $start_time = [Time::HiRes::gettimeofday()]; 
my $diff = Time::HiRes::tv_interval($start_time); 

print "\n\n$diff\n"; 
+5

Better trong những gì có ý nghĩa? – ysth

Trả lời

60

Có thể. Phụ thuộc vào ý bạn là "tốt hơn".

Nếu bạn đang yêu cầu giải pháp "tốt hơn" về chức năng, thì điều này là khá nhiều.

Nếu bạn đang yêu cầu một "tốt hơn" theo nghĩa "ít vụng về" ký hiệu, sau đó biết rằng, trong bối cảnh vô hướng, Time::HiRes::gettimeofday() sẽ trở lại giây nổi kể từ kỷ nguyên (với phần thập phân đại diện cho micro), chỉ như Time::HiRes::time() (đó là một sự thay thế thả trong tốt cho tiêu chuẩn time() chức năng.)

my $start = Time::HiRes::gettimeofday(); 
... 
my $end = Time::HiRes::gettimeofday(); 
printf("%.2f\n", $end - $start); 

hay:

use Time::HiRes qw(time); 

my $start = time(); 
... 
my $end = time(); 
printf("%.2f\n", $end - $start); 
1

Điều đó khá nhiều - điều đó sẽ cho bạn thời gian trôi qua có độ phân giải cao. Trừ khi, tất nhiên, một người nào đó lộn xộn với đồng hồ hệ thống.

18

Phụ thuộc vào những gì bạn đang đang làm. Nếu bạn muốn đo thời gian đồng hồ treo tường (số lượng thời gian thực tế đã trôi qua), bạn không thể nhận được tốt hơn nhiều. Nếu bạn muốn đo thời lượng máy tính đã làm gì đó thì bạn có thể muốn xem hàm times hoặc lệnh time. Hàm times trong Perl trả về danh sách thời gian tích lũy hiện tại cho mã này và mã của bất kỳ mô-đun nào bạn đang sử dụng, quá trình này trong các cuộc gọi hệ thống, tất cả các con của quá trình này trong mã người dùng trong các cuộc gọi hệ thống.

#!/usr/bin/perl 

use strict; 
use warnings; 
use Time::HiRes; 

my $start_time = [Time::HiRes::gettimeofday()]; 
. 
. 
. 
my ($user, $system, $child_user, $child_system) = times; 
print "wall clock time was ", Time::HiRes::tv_interval($start_time), "\n", 
    "user time for $$ was $user\n", 
    "system time for $$ was $system\n", 
    "user time for all children was $child_user\n", 
    "system time for all children was $child_system\n"; 

Lệnh time trong UNIX tương tự như chức năng. Bạn chạy một lệnh như thế này

time ./script.pl 

và nó sẽ tạo ra một cái gì đó như thế này

real 0m0.692s 
user 0m0.019s 
sys  0m0.109s 

nơi thực sự là bức tường đồng hồ thời gian và người sử dụng và sys cũng giống như người dùng và hệ thống trên.

Lệnh time dễ sử dụng hơn, nhưng chức năng times cung cấp cho bạn nhiều thông tin hơn và dễ dàng hơn trong chương trình máy tính (cộng với lợi ích khi tạo kết quả khi chương trình vẫn đang chạy).

Ồ, tôi quên đề cập đến $^T. Biến này chứa thời gian bắt đầu của chương trình trong vài giây kể từ khi kỷ nguyên, vì vậy nếu bạn chỉ quan tâm đến một granularity của giây, bạn chỉ có thể nói

END { print "The program ran for ", time() - $^T, " seconds\n" } 

gần phía trên cùng của chương trình của bạn.

0

này rất hữu ích cho timings tại chức, granularity của một giây:

Tại bắt đầu ...

$debugtimer = time; 
$debugstr = ""; 

... bất cứ nơi nào và ở khắp mọi nơi bạn thích ...

kerchunk("message") # message is short description of location in code 

... kết thúc chương trình ...

print "timings: $debugstr"; 

... và với tàu ngầm của bạn:

sub kerchunk 
{ 
    my ($msg) = shift; 
    my $pertock = time; 
    my $kch = abs($debugtimer - $pertock); 
    $debugstr .= "Elapsed at $msg: $kch<br>\n"; 
} 
Các vấn đề liên quan