多くのアプリケーションで-v
フラグを使用することが少なくなっています(特にtar
やcp
などの簡単なもの)。ただし、サイズの大きいファイルを解凍すると、-v
フラグを使用しない場合よりも時間がかかります。
これは端末がテキストを処理する必要があり、バッファにどんなバッファがあっても満たすためだと思います。しかし、私の質問は、これによりアプリケーションの実行速度が実際に遅くなるのですか、それとも同じ時間で完了しますか?
はい、詳細を実行するとアプリケーションの速度が低下します。
どの程度がアプリケーションに依存します。
端末へのすべての印刷には、追加の処理時間が必要になります。 printf()またはその姉妹のいずれかを使用する場合、これはかなりの量の処理が無駄になります。
また、端末はそのデータを処理する必要があります。アプリケーションと端末の間のバッファスペースには制限があり、IOチャネルは、実際にデータを出力するのに十分なスペースがバッファにあるまでブロックされます。アプリケーションは通常、このブロッキングが行われている間、続行できます。1
また、端末にデバッグテキストを表示する作業は、処理サイクルを消費します。繰り返しますが、これはアプリケーション(デバッグの量)、ターミナルプログラム(使用されるフォント、エフェクトなど)、さらには使用中のXウィンドウドライバー(ハードウェアアクセラレーションなど)にも依存します。
time
プログラムを使用すると、コマンドの実行にかかった時間をかなり正確に判断できます。同じプログラムを2回実行すると、1回はデバッグあり、1回はデバッグなしで、プログラムがどの程度の違いをもたらすかがわかります。コマンドを実行する前にコマンドを1回実行して、コマンドの両方のテスト実行でキャッシングが同じであることを確認することをお勧めします。ほとんどのデータは最初の実行でキャッシュされたので、2番目の実行を大幅に高速化して結果を歪めたくありません...
1 マルチスレッドアプリケーションの場合、実際には、デバッグ出力を実行するスレッドのみがブロックします。
実行しているアプリケーションによって異なります。ただし、一般的に、ほとんどの一般的なLinuxアプリケーションはstdoutとI/Oまたはプロセッサの境界間でアクションを同期する必要があるため、冗長になると遅くなります。
OS X 10.7でのテストケースとして yes
を使用すると、予想どおり、大量の出力をターミナルに出力することが実際に問題になるようです。
これをさらに定量化して、yes
を5秒間実行しました。1つはターミナルに出力を印刷し、それをファイルに保存します(tee
を使用)、もう1つは同じことです。 stdout
を/dev/null
にリダイレクトすることを除いて:
yes | tee yeslog_term & sleep 5 && killall yes && wc -l yeslog_term
yes | tee yeslog_noterm > /dev/null & sleep 5 && killall yes && wc -l yeslog_noterm
ケース1は2371584行を示し、ケース2は136421376行を示します。または57倍以上。この場合、yes
の「パフォーマンス」(単位時間あたりに印刷される行数で測定)は57倍遅くなります )。
ここでの注意点の1つは、ここでyes
をtee
と組み合わせて使用したことです。これは結果にわずかに影響する可能性がありますが、結果はまだ有効だと思います。
プログラムがスローダウンするもう1つの兆候は、ターミナルへの出力中にyes
を実行すると、ターミナルは約100%のCPUを使用し、yes
は約37%しか使用せず、yes
を実行していることです。端末に出力せずに100%を使用します(これはマルチコアマシン上にあるため、可能な場合はyes
が、端末によってスローダウンされた場合を除いて、より多くのCPUを使用できます)。
はいと答えるのは簡単です。アプリケーションの速度が低下します。しかし、はるかに真の答えは99%のケースでは問題にはなりません
アプリケーションが実際にCPU能力を必要とする何らかの種類の作業を行っている場合、画面に追加のテキスト行を印刷してanyの種類の差異を作成する可能性は0%に近いです。
実際、あなたは簡単にあなた自身の判断を下すことができます:アプリケーションがテキストの莫大な壁を噴出しているなら、それは実際にあなたに少し費用がかかるかもしれません。 たぶん
通常、詳細コードはif命令で評価され、制御が表示関数に渡されるたびに時間がかかり、コンテキストが切り替わり、割り込みが増えます。
ただし、詳細なコードが別のスレッドであり、完了の状態を時々チェックするだけの場合は、違いは無視できます。
この質問は、stackoverflowの経験豊富なプログラマーの貢献から多くの利益を得ることができます。私は移動することをお勧めします:)