C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[21]: std::ofstream とCFileの書き込み速度


(過去ログ 31 を表示中)

[トピック内 29 記事 (1 - 20 表示)]  << 0 | 1 >>

■14968 / inTopicNo.1)  std::ofstream とCFileの書き込み速度
  
□投稿者/ セイン (72回)-(2008/02/29(Fri) 14:04:43)

分類:[C/C++] 

2008/02/29(Fri) 14:05:14 編集(投稿者)
.NET2005 C++

いつもお世話になっています。
テキストファイルを出力するのに、stdの関数のofstreamとCFileのどちらが
適切かを試すために、双方試したところ、ofstreamのほうが、倍ほど早く
内容を保存することができました。

しかし、周りの人間からは内部では同じ関数を呼んでるから、
普通なら同じ処理時間になるはずだ!言われたのですが、
実際はどうなのでしょうか?教えてください。

もし、ofstreamの方が早いのであれば、なぜ早いかまで
教えていただけるとうれしいです。


下記は使用した関数です。
実験として、書き込み部分を1万回ほどループにて行いました。
CFile
	// 書き込み用ファイル
	CFile mFile;
	CString str;
	mFile.Write(str, str.GetLength());

ofstream
	std::ofstream	mFile;
	CString str;
	mFile<< (LPCSTR)str;

引用返信 編集キー/
■14969 / inTopicNo.2)  Re[1]: std::ofstream とCFileの書き込み速度
□投稿者/ επιστημη (845回)-(2008/02/29(Fri) 14:18:15)
επιστημη さんの Web サイト
> しかし、周りの人間からは内部では同じ関数を呼んでるから、
> 普通なら同じ処理時間になるはずだ!言われたのですが、

説得力ないなー。

1. 近所の本屋に注文する
2. アマゾンで"ぽちっとな"する
どちらも内部では同じ出版社に発注が飛ぶんだから
両者は同じ日に手元に届く? そんなバカな。

出版社に発注が飛んでから本屋/アマゾンに届くまでは
同じかも知れないが、それ以外は全く異なる処理が行われるでしょう。
"それ以外の処理"が出版社での処理に比べて無視できるほどに
小さければほとんど同じでしょうけどね。

引用返信 編集キー/
■14970 / inTopicNo.3)  Re[1]: std::ofstream とCFileの書き込み速度
□投稿者/ Blue (365回)-(2008/02/29(Fri) 14:19:03)
CFile::Writeではなく文字列専用のCStdioFile::WriteStringだとどうなるでしょうか?
引用返信 編集キー/
■14971 / inTopicNo.4)  Re[2]: std::ofstream とCFileの書き込み速度
□投稿者/ セイン (73回)-(2008/02/29(Fri) 14:49:08)
επιστημη さん
> しかし、周りの人間からは内部では同じ関数を呼んでるから、
> 普通なら同じ処理時間になるはずだ!言われたのですが、

呼ぶ関数は違うけど、関数の内部ではC言語のsprintfとかの
同じ関数を呼んでいるはずだから同じ速度になるはずでしょ?
などと言われました。

Blueさん
ちょっとやってみますね。


引用返信 編集キー/
■14983 / inTopicNo.5)  Re[3]: std::ofstream とCFileの書き込み速度
□投稿者/ アキラ (7回)-(2008/02/29(Fri) 18:23:32)
アキラ さんの Web サイト
No14971 (セイン さん) に返信

内部で同じ関数使ってても、inlineだったりif文の数だったりで速さがだいぶ変わりますよ
そういう意味では、「言語標準の関数の方がfwriteを呼ぶまでのプロセスが短いからそっちのが速い」って言ってもいい気がします

CFile::Writeはソース見れますが、その中で呼ばれてるWin32APIのWriteFileの中までは
見れない(どこにあるのかわからない)ので、くわしくはわかりません。
(VS2005のCFile::Writeはエラーチェック(if文とASSERT)が7回も行われてるので遅い気はしないでもない)
引用返信 編集キー/
■15042 / inTopicNo.6)  Re[4]: std::ofstream とCFileの書き込み速度
□投稿者/ セイン (75回)-(2008/03/03(Mon) 10:49:50)
No14983 (アキラ さん) に返信
>
> 内部で同じ関数使ってても、inlineだったりif文の数だったりで速さがだいぶ変わりますよ
> そういう意味では、「言語標準の関数の方がfwriteを呼ぶまでのプロセスが短いからそっちのが速い」って言ってもいい気がします

確かにそうですね。
エラーチェックも複数はしっていることは確認できました。

>
> CFile::Writeはソース見れますが、その中で呼ばれてるWin32APIのWriteFileの中までは
> 見れない(どこにあるのかわからない)ので、くわしくはわかりません。
> (VS2005のCFile::Writeはエラーチェック(if文とASSERT)が7回も行われてるので遅い気はしないでもない)

こちらも確認できました。
ofstreamは内部で型チェックしているので、さらに遅くなりそうと思ったのですが、
そうでもないようですねぇ。

現在速度的には下の順番です。
ofstreamが一番早いようです。

ofstream < CStdioFile::WriteString < CFile::Write

引用返信 編集キー/
■15046 / inTopicNo.7)  Re[5]: std::ofstream とCFileの書き込み速度
□投稿者/ アキラ (9回)-(2008/03/03(Mon) 11:41:16)
アキラ さんの Web サイト
型チェックはコンパイル時に解決されるから実行時のコストはないでしょう
引用返信 編集キー/
■15081 / inTopicNo.8)  Re[6]: std::ofstream とCFileの書き込み速度
□投稿者/ セイン (76回)-(2008/03/04(Tue) 10:38:43)
No15046 (アキラ さん) に返信
> 型チェックはコンパイル時に解決されるから実行時のコストはないでしょう

型チェックという言い方はまずかったです。
イメージ的にはストリームの<<の内容がint型の時の処理文字列型の処理など、
内部で別れているように見えたのですが、いかがでしょうか?
その分岐の分遅いかなと思ったのですが?

int a = 0;
CString str = aaa;
std::ofstream mFile;

mFile<< a << str;
引用返信 編集キー/
■15083 / inTopicNo.9)  Re[7]: std::ofstream とCFileの書き込み速度
□投稿者/ επιστημη (847回)-(2008/03/04(Tue) 10:44:25)
επιστημη さんの Web サイト
> イメージ的にはストリームの<<の内容がint型の時の処理文字列型の処理など、
> 内部で別れているように見えたのですが、いかがでしょうか?

だからー。型による処理の振り分けはコンパイル時に完了しています。
printfなんかだとフォーマット文字列を舐めて%dだからどーのこーの
って振り分けを実行時にやってますけども。

引用返信 編集キー/
■15084 / inTopicNo.10)  Re[7]: std::ofstream とCFileの書き込み速度
□投稿者/ Tom Yama (37回)-(2008/03/04(Tue) 10:44:54)
No15081 (セイン さん) に返信
> ■No15046 (アキラ さん) に返信
>>型チェックはコンパイル時に解決されるから実行時のコストはないでしょう
>
> 型チェックという言い方はまずかったです。
> イメージ的にはストリームの<<の内容がint型の時の処理文字列型の処理など、
> 内部で別れているように見えたのですが、いかがでしょうか?
> その分岐の分遅いかなと思ったのですが?
>
> int a = 0;
> CString str = aaa;
> std::ofstream mFile;
>
> mFile<< a << str;
ですから、それは、コンパイル時に、解決されます。
引用返信 編集キー/
■15086 / inTopicNo.11)  Re[7]: std::ofstream とCFileの書き込み速度
□投稿者/ シャノン (308回)-(2008/03/04(Tue) 11:05:36)
No15081 (セイン さん) に返信
> ■No15046 (アキラ さん) に返信
>>型チェックはコンパイル時に解決されるから実行時のコストはないでしょう
>
> 型チェックという言い方はまずかったです。
> イメージ的にはストリームの<<の内容がint型の時の処理文字列型の処理など、
> 内部で別れているように見えたのですが、いかがでしょうか?
> その分岐の分遅いかなと思ったのですが?
>
> int a = 0;
> CString str = aaa;
> std::ofstream mFile;
>
> mFile<< a << str;

オーバーロードって知ってます?

<< 演算子の実体は std::ofstream::operator << ですが、こいつの引数が何パターンもあるんです。
同じ名前の関数がいくつもあるんです。
文字列用の <<、整数用の <<、…といった具合に。
一つの << の中で引数に応じて分岐するわけではありません。
引用返信 編集キー/
■15093 / inTopicNo.12)  Re[7]: std::ofstream とCFileの書き込み速度
□投稿者/ アキラ (10回)-(2008/03/04(Tue) 11:53:06)
アキラ さんの Web サイト
No15081 (セイン さん) に返信
> 型チェックという言い方はまずかったです。
> イメージ的にはストリームの<<の内容がint型の時の処理文字列型の処理など、
> 内部で別れているように見えたのですが、いかがでしょうか?
> その分岐の分遅いかなと思ったのですが?

オーバーロードによってコンパイル時に呼ばれる関数が決まるので
「型による処理の分岐」には実行時コストはありません
std::ostream& operator<<(std::ostream&, int);
std::ostream& operator<<(std::ostream&, const char*);
std::ostream& operator<<(std::ostream&, const std::string&);
※これはイメージ

型ごとの処理内容は異なりますが
引用返信 編集キー/
■15108 / inTopicNo.13)  Re[8]: std::ofstream とCFileの書き込み速度
□投稿者/ セイン (77回)-(2008/03/04(Tue) 18:05:20)
オーバーロードといわれるとピンときました。
関数を読んだ時点で決まっているのであれば、たしかにコストはないですよね。

後は倍も速度が違う理由としては、アキラさんがはじめに教えてくれた、

>内部で同じ関数使ってても、inlineだったりif文の数だったりで速さがだいぶ変わりますよ
>そういう意味では、「言語標準の関数の方がfwriteを呼ぶまでのプロセスが短いからそっちのが速い」って言ってもいい気がします

>CFile::Writeはソース見れますが、その中で呼ばれてるWin32APIのWriteFileの中までは
>見れない(どこにあるのかわからない)ので、くわしくはわかりません。
>(VS2005のCFile::Writeはエラーチェック(if文とASSERT)が7回も行われてるので遅い気はしないでもない)

ということでいいのでしょうか?
一度お試しで、C言語標準のsprintfなどを使ってみて速度を見た法がいいでしょうか?
引用返信 編集キー/
■15109 / inTopicNo.14)  Re[9]: std::ofstream とCFileの書き込み速度
□投稿者/ シャノン (309回)-(2008/03/04(Tue) 18:17:53)
No15108 (セイン さん) に返信

そもそも論なのですが、どうして原因を解明したいのでしょうか?
CFile を使うか ofstream を使うかの判断基準が速度だけなのでしょうか?
引用返信 編集キー/
■15129 / inTopicNo.15)  Re[10]: std::ofstream とCFileの書き込み速度
□投稿者/ セイン (78回)-(2008/03/05(Wed) 09:37:42)
No15109 (シャノン さん) に返信

ご指摘ありがとうございます。

会社の上司や社長に内部では前段階の処理としていろいろやっているかもしれないが、一番最後にファイルに書き込むときには、
同じ関数を呼んでいるんだから、同じ速度になるはず!

といわれました。
これが違う!と納得させるだけの根拠がほしいのです。

引用返信 編集キー/
■15130 / inTopicNo.16)  Re[11]: std::ofstream とCFileの書き込み速度
□投稿者/ επιστημη (848回)-(2008/03/05(Wed) 09:53:46)
επιστημη さんの Web サイト
> これが違う!と納得させるだけの根拠がほしいのです。

- 「同じ関数を呼んでいる」の根拠を求む。
- 「"前段階の処理"に要する時間が"ファイル書き込み"のそれに比べ、無視できるほど小さい」の根拠を求む。

上記二項が納得いかない限り「実測結果」を覆せない。

引用返信 編集キー/
■15131 / inTopicNo.17)  Re[11]: std::ofstream とCFileの書き込み速度
□投稿者/ シャノン (310回)-(2008/03/05(Wed) 09:54:30)
No15129 (セイン さん) に返信

ふむー。

> 会社の上司や社長に内部では前段階の処理としていろいろやっているかもしれないが、一番最後にファイルに書き込むときには、
> 同じ関数を呼んでいるんだから、同じ速度になるはず!
>
> といわれました。

「前段階の処理としていろいろやってるんだから、その部分で差がついてるんです」ってことですけど、「前段階の処理としていろいろやってる」ってことがわかってるのに、どうしてそういうコメントが出てくるかなぁ…
最終的にはどちらも WriteFile に行き着くでしょうから、そこから先の処理速度は同じでしょうけど。

「前段階の処理の差です」の一言じゃダメなのかな。
例えば、「CFile は途中で if 文がいくつあって、ofstream はいくつだから、こっちの方が早いんです」みたいな報告をしなきゃならないとか?
難儀だねぇ。
引用返信 編集キー/
■15132 / inTopicNo.18)  Re[11]: std::ofstream とCFileの書き込み速度
□投稿者/ ぽぴ王子 (327回)-(2008/03/05(Wed) 10:04:44)
ぽぴ王子 さんの Web サイト
お話に割り込むようでごめんなさいね。

No15129 (セイン さん) に返信

> 会社の上司や社長に内部では前段階の処理としていろいろやっているかもしれないが、一番最後にファイルに書き込むときには、
> 同じ関数を呼んでいるんだから、同じ速度になるはず!
>
> といわれました。
> これが違う!と納得させるだけの根拠がほしいのです。

うーん…たぶんシャノンさんも同じことを言われるかもしれないですが
根拠がほしいのはわかるのだけれど、なぜその根拠がほしいと思うのか
が知りたいんじゃないでしょうか。

上司や社長を打ち負かしたいのか。
自分は速度は同じにはならないと思っているし、それを証明したいのか
あるいはス○夫が高価なラジコンを持っているからド○えもんなんとか
してぇ〜なのか。

自分であれば「あーそうかもしれませんね」と表向き納得しつつ
「裏でエラーチェックだって走ってんだから最終的な速度の前にブレーキ
かかってるんだよドアホ」とか心の中で叫んでおしまいにしそうだったので。
実は組み込み系の仕事をしていて、1μ秒の世界を争っているので、そこ
はどうしても速い方を使いたいんだ!とかいうのであれば、それこそ
人に聞くのではなく自分の目で確かめたほうがいいかなと。

---- この辺から余談
セインさんのフィルタを通して見ているからかもしれませんが、上司の
方の言い分がよくわかりません。

> 会社の上司や社長に内部では前段階の処理としていろいろやっているかもしれないが、一番最後にファイルに書き込むときには、
> 同じ関数を呼んでいるんだから、同じ速度になるはず!

これね。
「一番最後にファイルに書き込むときは同じ関数を呼ぶ」はいいんですよ。
でもそれが「同じ速度になる」理由にはならないと思うのです。

…って書いてたらεπιστημηさんとシャノンさんに先を越された orz
引用返信 編集キー/
■15133 / inTopicNo.19)  Re[12]: std::ofstream とCFileの書き込み速度
□投稿者/ なちゃ (109回)-(2008/03/05(Wed) 10:14:47)
つか、そもそもたとえ最後に同じ関数使ってたって、
その最後の関数の速度が同じになるとは言えんでしょう…

引用返信 編集キー/
■15135 / inTopicNo.20)  Re[13]: std::ofstream とCFileの書き込み速度
 
□投稿者/ 774RR (139回)-(2008/03/05(Wed) 10:20:32)
社長や上司に ボルトネック ぢゃなかった ボトルネック という言葉を使ってみるに1票

引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -