コマンドを実行すると、冗長になりますか?


37

私は自分自身-vがますます多くのアプリケーションにフラグを使用していることに気付きました(特にtarandのような些細なものcp)。ただし、大きなファイルを解凍すると、-vフラグを使用しなかった場合よりも時間がかかります。

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


あなたは、例えばtar xvf file.tar > /dev/null対時間を計ろうとしましたtar xf file.tarか?にリダイレクトする/dev/nullと、これから端末が削除されます。
ベンジャミンバニエ

3
また、stdoutstderrラインバッファリングされていることに注意してください(バッファをいっぱいにするのにそれほど時間がかからないことを意味しprintfます)。
new123456

1
あなたがWindowsコマンドについて話していたなら、私は確かにそれが本当だと言うでしょう:)
kokbira

CPUを集中的に使用するタスクの場合、実行しているIOの量によっては、パフォーマンスが著しく低下する場合があります。
ユーザー14年

回答:


31

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

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

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

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

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

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


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


ほとんどのプログラマーはこれを非常に速く学習します(DOSのBorland C);)
Dragos

もちろん、コンソールウィンドウが隠されている(または部分的に覆われている)場合、コンソールが表示されているときほど影響はありません。コマンドプロンプトを開き、を実行しdir c:\/s/aます。速度の変化は、完全に見えて部分的に覆われているときに確認できます。最小化すると速度が向上することはわかりませんが、確実に高速になりますが、テストする場合は再起動する必要があります。キャッシュをバイパスすると、とにかく高速になります。ディスクにアクセスします。
Synetech

1
@SynここでLinuxについて話します。
マジェンコ

1
@Mattそれはまだ有効なコメントです。尊重してください。
ヒンクル

@Matt、doh!気づかなかった。(おそらくDOSのコメントから気をそらされたかもしれません。)とにかく、Linuxはまったく異なりますが、同じことが当てはまるのでしょうか(多くのテキストスクロールが低速で表示されるコンソール)。
Synetech

8

実行しているアプリケーションによって異なります。ただし、一般に、標準出力とI / Oまたはプロセッサ境界間でアクションを同期する必要があるため、冗長性はほとんどの一般的なLinuxアプリケーションの速度を低下させると言えます。


6

yesOS X 10.7でテストケースとして使用する場合、予想どおり、大量の出力をターミナルに出力するかどうかは確かに重要であると思われます。

これをもう少し定量化して、yes5秒間実行しました。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を使用できますが、端末によってスローダウンされた場合を除きます)。


5

はいと答えるのは簡単です。アプリケーションの速度が低下します。しかし、もっと本当の答えは、99%のケースでは重要ではないということです。

アプリケーションが実際にいくらかのCPUパワーを必要とする何らかの種類の作業を行っている場合、何らかの種類の違いを生むいくつかの余分なテキスト行を画面に印刷する可能性は0%に近いです。

実際、あなた自身で簡単に判断することができます。アプリケーションが膨大なテキストの壁を吐き出している場合、実際には少し費用がかかります。多分。


3
-1これは事実ではありません。printf()非常に高価です
トーマスボニーニ

1
私が言ったことは本当でした。しかし、あなたがそれを私が言ったように見せようとしているのは、まったく別のものです。特定のstdlib印刷の効率については何も言っていません。私はプログラムが印刷に費やす時間が無視できるほど十分な仕事をするべきだと言っています。今、他の誰かをトロールしに行きます。
slarpspark

@slarpspark:式からprintf()を取り出しても、バイトストリームはまだbashを通過する必要があり、それから端末エミュレーター、端末エミュレーターはテキストを画面にレンダリングする必要がありますが、必ずしも無視できるわけではありませんエスケープ文字を解析した後、テキストレンダリングは、一部の冗長コマンドが実行する可能性のある速度で実行された場合、安価ではありません。また、プログラムがすべての行で出力バッファーをフラッシュすると、コンテキストの切り替えを意味するため、特にコストがかかります。Pythonスクリプトの作成中によく経験しますが、タイトループでプリントを削除すると、10秒から1秒になることがあります。
ライライアン

SSHを介して実行するコマンドについてはどうでしょうか。CPU時間が最小であっても、ネットワークレイテンシを確実に導入した場合、それは重要です。
ec2011

3

通常、冗長コードはif命令で評価され、表示関数に時間がかかるほど制御が渡されるたびに、コンテキストが切り替えられ、より多くの割り込みが発生します。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.