2010年6月17日木曜日

◆コマンドの実行時間を計測する(Measure-Command)

前回、PowerShell: ◆ファイルにテキストを設定する(Set-Conten,Add-Content)で2通りの方法でテキストファイルを連結したが、どちらの方法がベターか計測してみる。
Powershellには計測用のコマンドとしてMeasure-Commandが用意されている。
Measure-Command{Get-Content a.txt , b.txt  |  Set-Content  c.txt }
Measure-Command{Set-Content  c.txt  -Value (Get-Content  a.txt , b.txt)}

20100617001627

何度か計測してみたが速度的にはばらつきがあり、どちらが速いとも判断しかねる。
ただし、メモリー使用量をみると大きな違いがある。
最大使用量は大差が無いが、パイプを使ったほうは実行後メモリー使用量が下がるのに、パイプを使わないほうは実行後もメモリーを消費したまま。
パイプのほうはすべての読み込みを待たずに次の処理へ順次データを渡すからだと思う。
以下のように括弧で囲むとすべて読み込んだ後にパイプに渡すので両者の処理は同じになるのではないだろうか。
(Get-Content a.txt , b.txt)  | Set-Content c.txt
どちらにしても、ファイルサイズに比べてやけにメモリー使用量が大きいようなので、このような処理を行うときはセッションを区切ったほうが良さそうだ。
コマンドラインから実行するときは、Powershellと打つと同じ画面でもう一つセッションを開始できるので、その中で実行すると良さそう。
Dosコマンドで、
Copy  a.txt+b.txt  c.txt
としたほうが有利かも?
ってか圧倒的に有利(速度、メモリーとも)。PowershellからDosコマンドを実行するには
cmd  /c “Copy  a.txt+b.txt  c.txt”
Powershellでも
Copy-Item -Path a.txt , b.txt  -Destination c.txt
と書けるのだが、結果が思った通りにならない。(b.txtの内容がc.txtにセットされるだけ)
Pathの配列指定ってどう使うんだろ・・・。

あぁ、コピー先がディレクトリーの時か・・・。

0 件のコメント:

コメントを投稿