2013-06-17 6 views
14

stat()システムコールは本当に高価ですか?私はどこかで、使用するにはコストのかかるシステムコールであると読んでいます。本当か?もしそうなら、他の選択肢はありますか?stat()は高価なシステムコールですか?

+5

'expensive()'?それは別のシステムコールですか? – devnull

+4

プロファイリングを試して、実際の費用を確認しましたか? – ssube

+7

短い答えはいいえです。唯一の高価な部分は、ディスクからファイルのinodeを読み取ることです。 linuxはinodeを非常に効果的にキャッシュしているので、ブート時から何らかの形で見たファイルは、キャッシュにinodeがすでに保存されています。 access()のような他の呼び出しがありますが、とにかくstat()を呼び出します。 fopen()を使うか、単にopenにするだけでもっと多くのリソースが使われます。 –

答えて

19

標準設定では、ファイル情報を取得するには、stat(2),fstat(2)およびlstat(2)が唯一の標準的な設定です。パフォーマンス上の問題が発生している場合は、アプリケーションのプロファイルを作成して何が起こるかを確認することが重要です。

gcc -pgでコンパイルし、gprof(1)で実行可能ファイルを実行します。

Qtのような大きなライブラリを使用する可能性がありますが、パフォーマンス上の問題を処理できない可能性があり、とにかくstat(2)が使用される可能性があります。

高価であるかどうかにかかわらず、合理的な選択肢はありません。

ジム・マクマナラ氏のコメントと同様、これらの理由から正確には高価ではありません。他の選択肢がないので、glibcとlinuxのプログラマは、できるだけ実行可能なものにしました。

+2

また、複数回実行するプロファイルの結果に非常に注意することを検討してください。タッチしたすべてのファイルがキャッシュされるので、2回目の実行では、再実行したときに、同じファイルセットで誤って表示されます。 –

+1

心臓発作の後に開胸手術のような一種...はい、それは高価ですが、代替は何ですか...? – Jonathan

+0

手術チームは世界中のCプログラマーの信じられないほど才能のあるチームです。 –

3

「高価なv/sが必要」という疑問が生じます。

"User space"と "Kernel space"の2つのモードで実行され、open()、write()、stat()などのシステムコールが発行されると、プロセスはUser Spaceからカーネルモードは高価ですが、このシステムコールで何か意味のあることをしていない場合に限ります。stat()を使用してファイルの最後にアクセスした時刻だけを表示し、それ以上何もしていない場合は、 。

まず、stat()を呼び出す理由があるはずです。 第2に、コードの異なる部分の相対実行時間を比較する場合は、プロファイリングツールを使用します。これは、どの関数呼び出しが高価で、どれが高価でないかを証明する正確な統計情報を提供します。

+3

私は何をしているのですか? statを避けることは意味をなさない。過去にディレクトリにlsを実行した場合、ファイルはすでにキャッシュされている可能性があります。とにかく - それ以外の方法は何ですか? statを呼び出したり、statを呼び出すlsを使用する以外に、 –

4

実行ファイルには常にstraceを使用できます。再コンパイルする必要はありません。この機能を使用すると、各システムコールの実際の実行時間を取得できます。