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

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

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

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


(過去ログ 31 を表示中)

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

■15136 / inTopicNo.21)  Re[13]: std::ofstream とCFileの書き込み速度
  
□投稿者/ シャノン (311回)-(2008/03/05(Wed) 10:35:32)
No15133 (なちゃ さん) に返信
> つか、そもそもたとえ最後に同じ関数使ってたって、
> その最後の関数の速度が同じになるとは言えんでしょう…

そぉなのかな。
最後の関数が Win32 WriteFile であるという前提の元では、μs単位で同じとは言わんけど、だいたい同じになると思うけどなぁ。
引用返信 編集キー/
■15186 / inTopicNo.22)  Re[14]: std::ofstream とCFileの書き込み速度
□投稿者/ PATIO (16回)-(2008/03/06(Thu) 13:09:35)
No15136 (シャノン さん) に返信
> ■No15133 (なちゃ さん) に返信
>>つか、そもそもたとえ最後に同じ関数使ってたって、
>>その最後の関数の速度が同じになるとは言えんでしょう…
>
> そぉなのかな。
> 最後の関数が Win32 WriteFile であるという前提の元では、μs単位で同じとは言わんけど、だいたい同じになると思うけどなぁ。

そんな事は無いと思いますけれど、同じ関数を使っていても細切れに呼んでいたりすると遅いかもとか
思ってしまいました。ただ、標準で提供されている物がわざと遅くなるような実装をしているとも思えないので
実際には殆ど同じと考えて良さそうに思いますけどね。

しかし、話に出てくる上司ってどんな人なんでしょうねぇ。
聞いた話だけから見ると「えーっ、それで技術者?」って感じますけれど。
まあ、間接的に伝えられてきた情報なので受け取った人の解釈が
言った人が伝えたかった内容と一致しているとは限らないとは思いますけれど。

引用返信 編集キー/
■15209 / inTopicNo.23)  Re[15]: std::ofstream とCFileの書き込み速度
□投稿者/ セイン (79回)-(2008/03/06(Thu) 19:09:31)
皆さんありがとうございます。
昔からマイコンなどを触っている方々なので、プログラムのことを非常に詳しい方
でしたので、疑心暗鬼に陥っていました。
皆さんとにいろいろ教えていただいたので、晴れました。

余談になりますが、C言語のfopenとfputsを使って保存してみたところ、
FILE *fp;
CString str;
fputs(str, fp);

ofstream < CStdioFile::WriteString = fputs < CFile::Write

という速度の結果になりました。

ofsteramのみが飛びぬけて早かったです。

自分なりにofstreamの中を追いかけてみたところ、
以下の関数を使って書き込みをしていました。
C言語のfputsじゃなかったんですね^^;
basic_streambuf::sputn
basic_streambuf::sputc

これが速度の差の大きなところかなと思います。
解決済み
引用返信 編集キー/
■15210 / inTopicNo.24)  Re[16]: std::ofstream とCFileの書き込み速度
□投稿者/ アキラ (12回)-(2008/03/06(Thu) 21:22:53)
アキラ さんの Web サイト
No15209 (セイン さん) に返信

> 自分なりにofstreamの中を追いかけてみたところ、
> 以下の関数を使って書き込みをしていました。
> C言語のfputsじゃなかったんですね^^;
> basic_streambuf::sputn
> basic_streambuf::sputc
>

いえ、VC++8.0のofstreamはfwrite, fputcを使ってます
引用返信 編集キー/
■15215 / inTopicNo.25)  Re[17]: std::ofstream とCFileの書き込み速度
□投稿者/ セイン (80回)-(2008/03/07(Fri) 10:19:27)
No15210 (アキラ さん) に返信
> ■No15209 (セイン さん) に返信
> 
>>自分なりにofstreamの中を追いかけてみたところ、
>>以下の関数を使って書き込みをしていました。
>>C言語のfputsじゃなかったんですね^^;
>>basic_streambuf::sputn
>>basic_streambuf::sputc
>>
> 
> いえ、VC++8.0のofstreamはfwrite, fputcを使ってます

あうぅ。ごめんなさい僕の力不足です。そうなんですね。

以下ソースになるのですが、速度にそれぞれ差が出ました。
一番下に書いてあるのが、fputcになります。
ofstreamよりfputcのほうが僕の環境では遅くなります。



メイン関数側
	CLogHlp m_Log;
	m_Log.CreateWriteFile("C:\\tmp.txt");

	CString str;
	for(int i = 0; i < 100000; i++) {
		str.Format("%10d\t", i);
		m_Log.Write(str);
	}

	m_Log.WirteFileUnload();




ログ書き込みクラス
#pragma once
#include <fstream>

class CLogHlp
{
public:
	CLogHlp() 
	{
	}

	~CLogHlp() 
	{
		try {
			WirteFileUnload();
		} catch(...) {}
	}

	/** ファイル読み込み @return TRUE:オープン成功 FALSE:失敗 */
	BOOL CreateWriteFile
	(
		LPCSTR path					///< [I]ファイルパス
	)
	{
		int ret = TRUE;
		try{
			// ファイル作成
			if(mWriteFile.Open(path, CFile::modeCreate|CFile::modeWrite) != TRUE) {
				ret = FALSE;
			}
		}catch(...) {
			ret = FALSE;
		}
		return ret;
	}

	/* オープン中のファイルクローズ */
	void WirteFileUnload()
	{
		if(mWriteFile.m_hFile != CFile::hFileNull) {
			mWriteFile.Close();
		}
	}

	/* 書き込み */
	BOOL Write
	(
		CString str					///< [I]保存内容
	)
	{
		int ret = TRUE;
		try {
			mWriteFile.Write(str, str.GetLength());
		}
		catch(...) {
			ret = FALSE;
		}
		return ret;
	}

private:
	// 書き込み用ファイル
	CFile mWriteFile;
};



class CLogHlp
{
public:
	CLogHlp() 
	{
	}

	~CLogHlp() 
	{
		try {
			WirteFileUnload();
		} catch(...) {}
	}

	/** ファイル読み込み @return TRUE:オープン成功 FALSE:失敗 */
	BOOL CreateWriteFile
	(
		LPCSTR path					///< [I]ファイルパス
	)
	{
		try {
			setlocale(LC_ALL, "Japanese"); 
			// ファイルオープン
			fsm.open(path, std::ios::trunc | std::ios::out);
			if(fsm.is_open() == false)
			{
				// 既にオープン中
				return FALSE;
			}
		}
		catch(...) {
			return FALSE;
		}
		return TRUE;
	}

	/* オープン中のファイルクローズ */
	void WirteFileUnload()
	{
		if(fsm.is_open() == true)
		{				
			// ファイルのクローズ
			fsm.close();
		}
	}

	/* 書き込み */
	BOOL Write
	(
		CString str					///< [I]保存内容
	)
	{
		int ret = TRUE;
		try {
			fsm << (LPCSTR)str;
		}
		catch(...) {
			ret = FALSE;
		}
		return ret;
	}

private:
	// ファイルストリーム
	std::ofstream	fsm;
};



class CLogHlp
{
public:
	CLogHlp() 
	{
	}

	~CLogHlp() 
	{
		try {
			WirteFileUnload();
		} catch(...) {}
	}

	/** ファイル読み込み @return TRUE:オープン成功 FALSE:失敗 */
	BOOL CreateWriteFile
	(
		LPCSTR path					///< [I]ファイルパス
	)
	{
		try {
		  if((fopen_s( &fp, path, "w" )) != 0 ){
			  return FALSE;
		  }

		}
		catch(...) {
			return FALSE;
		}
		return TRUE;
	}

	/* オープン中のファイルクローズ */
	void WirteFileUnload()
	{
		try {
			fclose(fp);
		}
		catch(...) {
		}
	}

	/* 書き込み */
	BOOL Write
	(
		CString str					///< [I]保存内容
	)
	{
		int ret = TRUE;
		try {
			fputs(str, fp);
		}
		catch(...) {
			ret = FALSE;
		}
		return ret;
	}

private:
	// ファイルストリーム
	FILE *fp;
};

引用返信 編集キー/
■15221 / inTopicNo.26)  Re[18]: std::ofstream とCFileの書き込み速度
□投稿者/ アキラ (13回)-(2008/03/07(Fri) 11:52:53)
アキラ さんの Web サイト
No15215 (セイン さん) に返信

↑のコードを試してみました

検証環境:VC++8.0(2005) MFC マルチバイト
修正内容:CLogHlp::Writeの引数をCStringからconst CString&に変えた
検証結果:fputs < ofstream < CFileの順に速い

【Debug - 修正前】
CFile::Write : 0.39秒
ofstream : 0.203秒
fputs : 0.156秒

【Debug - 修正後】
CFile::Write : 0.375秒
ofstream : 0.187秒
fputs : 0.156秒

【Release - 修正前】
CFile::Write : 0.312秒
ofstream : 0.109秒
fputs : 0.094秒

【Release - 修正後】
CFile::Write : 0.312秒
ofstream : 0.109秒
fputs : 0.094秒


引用返信 編集キー/
■15234 / inTopicNo.27)  Re[19]: std::ofstream とCFileの書き込み速度
□投稿者/ 黒龍 (94回)-(2008/03/08(Sat) 14:59:34)
私見ですが極論すると同じデバイスに出力してるんだったら変な呼び出
し方しない限りは同じになると思います。
fputでの速度差というのはofstreamなりに最適化がかかった箇所と自分
で書いた場所の速度差なわけで作為的な結果と受け取れなくも無いです。
MFCの方は差があってしかり(前段階の処理の差)だとは思うのですが最初
に書いたようにデバイス速度の方が最終的には効いてくると思います。
(むしろ差が出るようなオーバヘッドは発生させないべき)
0.1秒が0.2秒とかの話じゃなく1分が2分にってことにはならないと思い
ますのでどう使われるかを念頭においた話が必要だと思います。
チョコチョコ呼び出しをすんごい回数やるんならローレベルな呼び出し
が必要でしょうしそれを避けるアプローチの検討の方が大事なので。
(どんな関数使うにしろ無駄は無駄)

ちょっと近視眼的になっちゃってるなぁと思ったので書きました。んな
こたわかっとると言う場合にはスルーしていただければ幸いです。
引用返信 編集キー/
■15235 / inTopicNo.28)  Re[20]: std::ofstream とCFileの書き込み速度
□投稿者/ アキラ (14回)-(2008/03/08(Sat) 17:39:46)
アキラ さんの Web サイト
個人的な意見を言えば
・一番速いものを選ぶ必要がとくにない
・一度に何万件も読み書きしない
のであれば、使いやすいものを使えばいいと思います

さらに個人的なことを言えば私はこんな感じですね
・C++汎用コードならifstream/ofstream
・MFCなら基本はCStdioFile、必要があればCFile(std::stringに入れたいとか、eVCのようにCStdioFileがないとか)


引用返信 編集キー/
■15283 / inTopicNo.29)  Re[21]: std::ofstream とCFileの書き込み速度
□投稿者/ セイン (81回)-(2008/03/10(Mon) 11:06:58)
お返事遅れてすいません。

アキラさんわざわざ実験していただきありがとうございます。
ポインタ渡しにすれば、確かにコスト削減になりますよね。
ありがとうございます。

ご指摘ご教授いただいたおかげで整理できました。
ありがとうございました。

お手間取らせて■No15235 (アキラ さん) に返信
> 個人的な意見を言えば
> ・一番速いものを選ぶ必要がとくにない
> ・一度に何万件も読み書きしない
> のであれば、使いやすいものを使えばいいと思います
>
> さらに個人的なことを言えば私はこんな感じですね
> ・C++汎用コードならifstream/ofstream
> ・MFCなら基本はCStdioFile、必要があればCFile(std::stringに入れたいとか、eVCのようにCStdioFileがないとか)
>
>
解決済み
引用返信 編集キー/

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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -