【问题标题】:accurately timing an execution of a system call using perl使用 perl 准确定时执行系统调用
【发布时间】:2011-01-21 23:09:01
【问题描述】:

有没有更好的方法以编程方式使用 perl 来跟踪 unix 进程的时间(开始时间、结束时间)?

例如,我有一个使用 system() 启动 unix 命令的 perl 脚本。我在 system() 之前和之后打印时间戳。

我的开始时间和结束时间的日志是一样的。我确定该过程何时完成只需几分钟,所以它不准确。

到目前为止,这是我的代码:

my $dt  = strftime('%Y%m%d', localtime(time));
my $dt2 = strftime('%Y%m%d-%H:%M:%S', localtime(time)); 
my @tbls = qx(mysql -u foo -pmypw --database $dbsrc -h $node -ss -e "show tables");

open (CRLOG, ">dump-$dt.log") || die "cannot append";
foreach my $tbls (@tbls)
{
   chomp $tbls;
   print CRLOG "TIME START => $dt2\n";
   my $crfile = qq{mysql -u foo -pmypw --database $dbsrc -h $node.test.com -ss -e "SELECT 'a','b','c' UNION SELECT 1,2,3 FROM $tbls"| tr "\t" ",">$node-$tbls.$dt.csv};   system($crfile); 
   print CRLOG "COMMAND => $crfile\n";
   print CRLOG "TIME END => $dt2\n";
}; 
close (CRLOG);

【问题讨论】:

  • 您在调用命令之前获取$dt2,而不是之后。

标签: perl


【解决方案1】:

$dt2 是一个常数,但看起来您希望它在每次使用时重新计算时间戳。为此,您应该使用一个函数。

sub dt2 {
    return strftime('%Y%m%d-%H:%M:%S', localtime(time))
}

...

open (CRLOG, ">dump-$dt.log") || die "cannot append";
foreach my $tbls (@tbls)
{
   chomp $tbls;
   print CRLOG "TIME START => ", &dt2, "\n";
   my $crfile = qq{mysql -u foo -pmypw ...};
   system($crfile); 
   print CRLOG "COMMAND => $crfile\n";
   print CRLOG "TIME END => ", &dt2, "\n";
}; 
close (CRLOG);

【讨论】:

  • 谢谢!这很酷。它运作良好!在我对小桌子的样本测试中,我可以看到秒数的变化。
  • 如果你需要更多的粒度,也可以试试use Time::HiRes qw/time/
【解决方案2】:

您是否尝试过使用“时间”命令来计时命令执行?

http://www.computerhope.com/unix/utime.htm

因此,在您的 perl 脚本中,捕获输出将是这样的:

$time_me = `/usr/bin/time $my_command`;

然后解析 $time_me 变量以获取值。

【讨论】:

  • 不,我没试过,但是谢谢!作为一个选项,我也会检查一下。
猜你喜欢
  • 2016-01-20
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多