ハッシュを計算するための小さなCプログラムがあります(ハッシュテーブル用)。コードはかなりきれいに見えるといいのですが、それとは関係のない何かが私を悩ませています。
約0.2〜0.3秒で約100万のハッシュを簡単に生成できます(/ usr / bin / timeでベンチマーク)。ただし、forループでそれらをprintf()すると、プログラムの速度が約5秒に低下します。
- どうしてこれなの?
- それを速くする方法は?mmapp()ing stdout多分?
- これに関してstdlibcはどのように設計されていますか?また、どのように改善できますか?
- カーネルはどのようにそれをより良くサポートできますか?ローカルの「ファイル」(ソケット、パイプなど)のスループットを本当に高速にするには、どのように変更する必要がありますか?
興味深く詳細な返信を楽しみにしています。ありがとう。
PS:これはコンパイラ構築ツールセット用なので、恥ずかしがらずに詳細を確認してください。それは問題自体とは何の関係もありませんが、私はその詳細が私に興味を持っていることを指摘したかっただけです。
補遺
私は解決策と説明のためのよりプログラム的なアプローチを探しています。確かに、配管はその仕事をしますが、私は「ユーザー」が何をするかを制御できません。
もちろん、私は現在テストを行っていますが、これは「通常のユーザー」では実行されません。しかし、それは単純なprintf()がプロセスを遅くするという事実を変えません。これは、私が最適なプログラムによる解決策を見つけようとしている問題です。
補遺-驚くべき結果
参照時間は、TTY内のプレーンなprintf()呼び出しの場合で、約4分20秒かかります。
/ dev / pts(Konsoleなど)でテストすると、出力が約5秒に高速化されます。
テストコードでsetbuffer()を使用して16384のサイズにすると、ほぼ同じ時間がかかります。8192でもほぼ同じで、約6秒です。
setbuffer()は、それを使用しても明らかに効果がありません。同じ時間がかかります(TTYでは約4分、PTSでは約5秒)。
驚くべきことに、TTY1でテストを開始してから、別のTTYに切り替えると、PTSの場合とまったく同じように約5秒かかります。
結論:カーネルは、アクセシビリティと使いやすさに関係する何かをします。は!
通常、アクティブな状態でTTYを見つめたり、別のTTYに切り替えたりしても、同じように遅くなります。
レッスン:出力を多用するプログラムを実行する場合は、別のTTYに切り替えてください。