2017年1月27日金曜日

シェルスクリプトで時刻をミリ秒まで出したい

シェルスクリプトで、ログの時刻をミリ秒まで出したい箇所があり、date コマンドでは出せないという思い込み (UNIXの古い経験) から、perl で小さなツール (gettimeofday を呼ぶ程度) を書きました。そして、いちおう動くようになった、そのあとに、date コマンドで出せることを知りました。orz
最初のリサーチは大事ですね。
[root@hoge tmp]# date +"%F %T 0.%3N" ; ./mydate.pl ; date +"%F %T 0.%3N" ; ./mydate.pl
2017-01-27 07:53:22 0.131
2017-01-27 07:53:22 0.133
2017-01-27 07:53:22 0.133
2017-01-27 07:53:22 0.135
[root@hoge tmp]# /usr/bin/time -v date +"%F %T 0.%3N"
2017-01-27 07:53:36 0.230
 Command being timed: "date +%F %T 0.%3N"
 User time (seconds): 0.00
 System time (seconds): 0.00
 Percent of CPU this job got: 93%
 Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
 Average shared text size (kbytes): 0
 Average unshared data size (kbytes): 0
 Average stack size (kbytes): 0
 Average total size (kbytes): 0
 Maximum resident set size (kbytes): 724
 Average resident set size (kbytes): 0
 Major (requiring I/O) page faults: 0
 Minor (reclaiming a frame) page faults: 228
 Voluntary context switches: 1
 Involuntary context switches: 1
 Swaps: 0
 File system inputs: 0
 File system outputs: 8
 Socket messages sent: 0
 Socket messages received: 0
 Signals delivered: 0
 Page size (bytes): 4096
 Exit status: 0
[root@hoge tmp]# /usr/bin/time -v ./mydate.pl 
2017-01-27 07:53:46 0.445
 Command being timed: "./mydate.pl"
 User time (seconds): 0.00
 System time (seconds): 0.00
 Percent of CPU this job got: 100%
 Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
 Average shared text size (kbytes): 0
 Average unshared data size (kbytes): 0
 Average stack size (kbytes): 0
 Average total size (kbytes): 0
 Maximum resident set size (kbytes): 2300
 Average resident set size (kbytes): 0
 Major (requiring I/O) page faults: 0
 Minor (reclaiming a frame) page faults: 634
 Voluntary context switches: 1
 Involuntary context switches: 1
 Swaps: 0
 File system inputs: 0
 File system outputs: 8
 Socket messages sent: 0
 Socket messages received: 0
 Signals delivered: 0
 Page size (bytes): 4096
 Exit status: 0
[root@hoge tmp]# time date +"%F %T 0.%3N"
2017-01-27 07:56:18 0.292

real 0m0.001s
user 0m0.000s
sys 0m0.001s
[root@hoge tmp]# time ./mydate.pl 
2017-01-27 07:56:30 0.545

real 0m0.002s
user 0m0.001s
sys 0m0.001s
[root@hoge tmp]# 
このように、当然、perl で書いたら重い (と言ったって2ミリくらいだけど) ですね。手持ちの新旧VM環境を調べたところ、現在の RHEL/CentOS系 (RHEL3 以降) なら %N を使えるようです。というわけで、せっかく書いた mydate.pl は、お蔵入り。

2017-02-02追記
お手軽に性能計測と言えば、昔から time コマンドを使ってましたが、最近は perf stat が使えるので、備忘録です。
time コマンドよりも精細な計測が出来るので、今回のように処理時間が極く短いモノを測る場合は、こちらを利用すると良いようです。
[root@hoge tmp]# perf stat ./mydate.pl 
2017-02-02 03:21:50 0.747

 Performance counter stats for './mydate.pl':

          1.504866      task-clock (msec)         #    0.886 CPUs utilized          
                 0      context-switches          #    0.000 K/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
               592      page-faults               #    0.393 M/sec                  
         4,952,896      cycles                    #    3.291 GHz                      (33.77%)
         2,461,931      stalled-cycles-frontend   #   49.71% frontend cycles idle   
         2,461,430      stalled-cycles-backend    #  49.70% backend cycles idle     
         4,000,101      instructions              #    0.81  insn per cycle         
                                                  #    0.62  stalled cycles per insn
           760,869      branches                  #  505.606 M/sec                  
            31,136      branch-misses             #    4.09% of all branches          (88.50%)

       0.001698771 seconds time elapsed

[root@hoge tmp]# perf stat date +"%F %T 0.%3N"
2017-02-02 03:39:52 0.612

 Performance counter stats for 'date +%F %T 0.%3N':

          0.355000      task-clock (msec)         #    0.658 CPUs utilized          
                 0      context-switches          #    0.000 K/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
               193      page-faults               #    0.544 M/sec                  
         1,193,873      cycles                    #    3.363 GHz                    
           800,322      stalled-cycles-frontend   #   67.04% frontend cycles idle   
           636,341      stalled-cycles-backend    #  53.30% backend cycles idle     
           785,182      instructions              #    0.66  insn per cycle         
                                                  #    1.02  stalled cycles per insn
           144,848      branches                  #  408.023 M/sec                  
           branch-misses                                               

       0.000539333 seconds time elapsed

[root@hoge tmp]# 
time コマンドによる計測では、mydate.pl は、date コマンドより2倍程度の重さに見えてましたが、perf stat で計ると、4倍程度重いという結果が見てとれました。

0 件のコメント:

コメントを投稿

人気ブログランキングへ にほんブログ村 IT技術ブログへ