2012-03-05 22 views
2

私のC++プログラムのプロファイリング私は、ファイルの束を作成するときにstd :: ofstream()を呼び出すことが、システム "touch"を使用するよりもはるかに短い時間を要することを発見しました。std :: ofstreamとsystem touch

これで、Linux上でstd :: ofstreamがどのOS機能にマップされているのか疑問に思っていました。

ファイルを作成するためにstd :: ofstream()が何を呼び出すのか知っていますか?

おかげ

+1

コマンドラインから、または関数呼び出し 'system(" touch ... ");'? – hmjd

+1

C++関数(std :: ofstreamコンストラクタ)と実行可能ファイル(/ bin/touch)のパフォーマンスを比較するにはどうすればよいですか? – bobah

+0

はい、私はsystem()か、より良い:sprintf(temp、 "touch%s"、qPrintable(fileName))を使用します。しかし、答えから私は今なぜ私はそのようなオーバーヘッドを理解した。 – rmbianchi

答えて

5

system("touch filename");を実行している場合、これは誤解を招き、遅くなります(セキュリティリスク、、、...など)。それはそのようなシステムを呼び出すのではなく、シェルを生成し、プログラムを実行します(この場合はタッチします)。 ストリームを開くと、ファイルシステムに直接アクセスできる何らかの実際のシステムコールが使用されます。可能であればLinuxではhttp://linux.die.net/man/2/openです。 端末でstrace touchを実行して、どのシステムコールが作成しているかを調べてください。ファイルを開くだけで作成する単純なC++プログラムでも同じことが可能です。または、オープンソース実装(gcc)を使用している場合は、ソースを確認できます。

+0

少し話題ですが、これは私のような誰かに役立つかもしれません。私は、Macアプリケーション内からファイルを作成したかったのです。システム(「タッチファイル名」)がジョブを実行しましたが、ディスクルート上に作成されました。どうして?私は、それが相対的なパスを好むと同じパスのファイルに触れると思った...スティック! – StinkyCat

+0

@StinkyCat ** 'system()'は悪いですが、それを使用しないでください** **しかし、私は今日、プロセス戻り値で何かをテストしようとしていました。同様の問題がありました。いくつかのプラットフォームでは、ローカルプログラムを見つけることができなかったかもしれません。 'system'は新しいシェルを起動します。新しいシェルがプログラムが実行されているのと同じディレクトリで起動するとは言いませんが、Linux上にあるようです。とにかく、posixの標準では、「実装定義の方法で実行される」と言います(http://goo.gl/65q46)。 – BoBTFish

+1

はい私はあなたの答えを読むことからそれを得た:)しかし、私はちょうど小さなテストをしていた、そしてそれはそれを行かせるために大きな質問として私を打った。しかし、あなたはそれを明確にしました、ありがとう! – StinkyCat

4

また、バイナリとしてtouchの実行のオーバーヘッドを考慮すべきです。私は、パフォーマンスの向上が、ofstreamを測定するとメモリに永続的なバイナリを持つことが主な原因だと信じています。

+0

良い点は、タッチを実行するときにオペレーティングシステムのプロセスが作成されると思います。 – 01100110

1

system()と考えてください。これは、ディスクからtouchバイナリ、共有libsなどを読み込み、実行し、プロセスをクリーンアップして戻ってくるシェルをfork/execすることになります。

あなただけの非既存のファイルを作成するために、タッチを使用している場合、それはほとんどそれがSTDと等価です:: ofstream.open()いくつかの関数呼び出しを実行し、最終的にはシステムコールopen()、最終的にclose()に解決しようとしています。ずっと速い。しかし、実際にtouchの機能をエミュレートする場合、それはより複雑です。例えば。ファイルがすでに存在する場合は、タイムスタンプなどの変更のみが行われ、それ以上の変更が行われます。

実際の使用法のコード化にかかわらず、C++でのコーディングは、system()で外部プログラムを実行するよりも高速になります。

関連する問題