web-dev-qa-db-ja.com

コマンドを実行すると、詳細が遅くなりますか?

多くのアプリケーションで-vフラグを使用することが少なくなっています(特にtarcpなどの簡単なもの)。ただし、サイズの大きいファイルを解凍すると、-vフラグを使用しない場合よりも時間がかかります。

これは端末がテキストを処理する必要があり、バッファにどんなバッファがあっても満たすためだと思います。しかし、私の質問は、これによりアプリケーションの実行速度が実際に遅くなるのですか、それとも同じ時間で完了しますか?

37
n0pe

はい、詳細を実行するとアプリケーションの速度が低下します。

どの程度がアプリケーションに依存します。

端末へのすべての印刷には、追加の処理時間が必要になります。 printf()またはその姉妹のいずれかを使用する場合、これはかなりの量の処理が無駄になります。

また、端末はそのデータを処理する必要があります。アプリケーションと端末の間のバッファスペースには制限があり、IOチャネルは、実際にデータを出力するのに十分なスペースがバッファにあるまでブロックされます。アプリケーションは通常、このブロッキングが行われている間、続行できます。1

また、端末にデバッグテキストを表示する作業は、処理サイクルを消費します。繰り返しますが、これはアプリケーション(デバッグの量)、ターミナルプログラム(使用されるフォント、エフェクトなど)、さらには使用中のXウィンドウドライバー(ハードウェアアクセラレーションなど)にも依存します。

timeプログラムを使用すると、コマンドの実行にかかった時間をかなり正確に判断できます。同じプログラムを2回実行すると、1回はデバッグあり、1回はデバッグなしで、プログラムがどの程度の違いをもたらすかがわかります。コマンドを実行する前にコマンドを1回実行して、コマンドの両方のテスト実行でキャッシングが同じであることを確認することをお勧めします。ほとんどのデータは最初の実行でキャッシュされたので、2番目の実行を大幅に高速化して結果を歪めたくありません...


1 マルチスレッドアプリケーションの場合、実際には、デバッグ出力を実行するスレッドのみがブロックします。

32
Majenko

実行しているアプリケーションによって異なります。ただし、一般的に、ほとんどの一般的なLinuxアプリケーションはstdoutとI/Oまたはプロセッサの境界間でアクションを同期する必要があるため、冗長になると遅くなります。

9
Diogo

OS X 10.7でのテストケースとして yes を使用すると、予想どおり、大量の出力をターミナルに出力することが実際に問題になるようです。

これをさらに定量化して、yesを5秒間実行しました。1つはターミナルに出力を印刷し、それをファイルに保存します(teeを使用)、もう1つは同じことです。 stdout/dev/nullにリダイレクトすることを除いて:

  1. yes | tee yeslog_term & sleep 5 && killall yes && wc -l yeslog_term
  2. yes | tee yeslog_noterm > /dev/null & sleep 5 && killall yes && wc -l yeslog_noterm

ケース1は2371584行を示し、ケース2は136421376行を示します。または57倍以上。この場合、yesの「パフォーマンス」(単位時間あたりに印刷される行数で測定)は57倍遅くなります )。

ここでの注意点の1つは、ここでyesteeと組み合わせて使用​​したことです。これは結果にわずかに影響する可能性がありますが、結果はまだ有効だと思います。

プログラムがスローダウンするもう1つの兆候は、ターミナルへの出力中にyesを実行すると、ターミナルは約100%のCPUを使用し、yesは約37%しか使用せず、yesを実行していることです。端末に出力せずに100%を使用します(これはマルチコアマシン上にあるため、可能な場合はyesが、端末によってスローダウンされた場合を除いて、より多くのCPUを使用できます)。

6
Tim

はいと答えるのは簡単です。アプリケーションの速度が低下します。しかし、はるかに真の答えは99%のケースでは問題にはなりません

アプリケーションが実際にCPU能力を必要とする何らかの種類の作業を行っている場合、画面に追加のテキスト行を印刷してanyの種類の差異を作成する可能性は0%に近いです。

実際、あなたは簡単にあなた自身の判断を下すことができます:アプリケーションがテキストの莫大な壁を噴出しているなら、それは実際にあなたに少し費用がかかるかもしれません。 たぶん

5
slarpspark

通常、詳細コードはif命令で評価され、制御が表示関数に渡されるたびに時間がかかり、コンテキストが切り替わり、割り込みが増えます。

ただし、詳細なコードが別のスレッドであり、完了の状態を時々チェックするだけの場合は、違いは無視できます。

この質問は、stackoverflowの経験豊富なプログラマーの貢献から多くの利益を得ることができます。私は移動することをお勧めします:)

3
Dragos