2017-04-16 14 views
0

私はアルゴリズムをC++で実装していますが、実装の中では、キャッシュミス、命令、分岐ミスなどの統計情報を数えます。この情報は末尾にcoutと表示されています。しかし、実装がどれだけのスペースを使用しているかも知りたいです。 /usr/bin/time -vから出力を受け取る方法は?

result = subprocess.check_output(['/usr/bin/time', '-v','./program',input]) 

が、残念ながら唯一 ./programからの出力は、同様 /usr/bin/timeの出力を resultに格納されていない次のように私は subprocessを使用しています。ここ /usr/bin/timeからの一つの可能​​な出力は次のようになります。

User time (seconds): 3.41 
    System time (seconds): 0.06 
    Percent of CPU this job got: 99% 
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.48 
    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): 344016 
    Average resident set size (kbytes): 0 
    Major (requiring I/O) page faults: 0 
    Minor (reclaiming a frame) page faults: 72338 
    Voluntary context switches: 1 
    Involuntary context switches: 6 
    Swaps: 0 
    File system inputs: 0 
    File system outputs: 0 
    Socket messages sent: 0 
    Socket messages received: 0 
    Signals delivered: 0 
    Page size (bytes): 4096 
    Exit status: 0 

私はMaximum resident set size (kbytes):で唯一興味を持っています。何とかこの大文字をresultの中に保存できたら、私はそれを解析できることを期待していました。しかし、出力はresultにはまったく格納されず、単純に出力されます。この問題にアプローチする最善の方法は何ですか?

答えて

3

timeをSTDERRに出力するので、STDOUTにリダイレクトするか、別々にキャプチャする必要があります。 コマンド終了し、時間は、このプログラムの実行についてのタイミング統計を与える標準誤差にメッセージを書き込み

time command manpageから。

太字、斜体強調鉱山。

リダイレクトはstderr=subprocess.STDOUTで行われます

result = subprocess.check_output(
    ['/usr/bin/time', '-v', './program', input], 
    stderr=subprocess.STDOUT) 

または別々に2つのストリームをキャプチャするためにsubprocess.run()を使用します。

result = subprocess.run(
    ['/usr/bin/time', '-v', './program', input], 
    stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
stdout = result.stdout 
time_output = result.stderr 

subprocess.run()は、Python 3.5とアップで新たに追加されました。古いPythonバージョンを使用している場合は、直接subprocess.Popen()を使用してください(また、ASAPのアップグレードを検討してください)。

process = subprocess.Popen(
    ['/usr/bin/time', '-v', './program', input], 
    stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
stdout, time_output = process.communicate() 
関連する問題