mcrblog

vcpp-ml

1999年04月

30

[vcpp 00028387] Re: CString操作って遅いのでしょうか?

三沢です。

>  一時的に CString オブジェクトが作られているんでしょうね。リリースビルドで
> も同じでしょうか?

変わったという感じはしませんでした。

>  CString::Insert で一番後ろに挿入したら、もしかして速いかも?

最初CString::Insert()をやっていたんですが、Insert()の中でCopyMemoryとかやっ
ていたので、+=にしてみたのです。ループも少し修正したのですが、体感的にさほど
変わらずだっので・・・。

会社のJavaの開発の人に聞いたら、Javaでも同様の経験したということで、調べてみ
たら、毎回一時オブジェクトが作られていたようです。修正したところ、かなり速度
アップしたと言ってました。

--
_._._._._._._._._._....

   _/_/   Noriaki Misawa  m...@dti.ad.jp
  _/_/   DREAM TRAIN INTERNET INC. Planning Dept.
 _/_/   6-6-20 Akasaka, Minato-ku, Tokyo 107 Japan
_/_/   TEL +81-3-3505-8305
             ...._._ I'm @ DTI. ._._....
30

[vcpp 00028386] Re: CString操作って遅いのでしょうか?(J

> これだけではちょっと… (^^;
> 単一スコープ内で上記2行を行っているのなら、

あ、本来はループなんですが、Appendに+=を使っているということを伝えたかったの
で。

ループの部分はというと、

CString theBuf;
CStdioFile theFile;
// ~~ファイルを開く処理~~
while ( theFile.ReadString( strIn ) ) {

    // ~~行ごとにチェックして文字列を操作する。~~

    theBuf += strIn;    // バッファに追加

};


> が、一般的にファイルの読み書きではseek時間の方が重荷になるので、読み込み
> の場合なら
>
> 1.大容量の読み込みバッファを用意する
> 2.ファイルからバッファへ一気に読み込む
> 3.バッファから必要なデータの抽出
> 4.1へ戻る(EOFに達するまで繰り返す)
>
> というような、seek回数を減らすコーディングをした方が高速化の効果は大きい
> です。

そうですね。試したデータが、72文字くらいの行が、約7000行くらいあるので小さい
バッファで読み込みを繰り返していますからね。

本当はでかいバッファでどかんとやりたいのですが、どうしても改行ごとに処理をし
ないといけない構造でして。もっとも、途中で分断されても大丈夫なバッファ処理を
すればいいのでしょうが。(^^;)


--
_._._._._._._._._._....

   _/_/   Noriaki Misawa  m...@dti.ad.jp
  _/_/   DREAM TRAIN INTERNET INC. Planning Dept.
 _/_/   6-6-20 Akasaka, Minato-ku, Tokyo 107 Japan
_/_/   TEL +81-3-3505-8305
             ...._._ I'm @ DTI. ._._....
30

[vcpp 00028385] Re: CString操作って遅いのでしょうか?

こんにちわ

> 具体的にはこんな感じです。
> CString theBuf;

> theBuf += theReadData; // theReadDataは読み込んだデータ

 一時的に CString オブジェクトが作られているんでしょうね。リリースビルドで
も同じでしょうか?

 CString::Insert で一番後ろに挿入したら、もしかして速いかも?

=====================================
 住金制御エンジニアリング(株)
 コンピュータシステム部 中谷 俊幸
 mailto:n...@smicec.co.jp
=====================================
30

[vcpp 00028384] Re: CString操作って遅いのでしょうか?(J

石河@DSKです。

Subject: [vcpp 00028383] CString操作って遅いのでしょうか?(J
> 具体的にはこんな感じです。
> CString theBuf;
> theBuf += theReadData; // theReadDataは読み込んだデータ

これだけではちょっと… (^^;
単一スコープ内で上記2行を行っているのなら、

> もしかして、毎回オブジェクトを作っているのでしょうか・・・。

ということでしょうし、+=演算子の結果が思惑通りにならないのでは?

theBufをstaticにするとか、クラスメンバにしてファイル読み込みはメンバ関数
で行うとか、

CString theBuf;
for(;;){
    ... //ファイル読み込み
    theBuf += theReadData;
}

みたいな形にしないと。
が、一般的にファイルの読み書きではseek時間の方が重荷になるので、読み込み
の場合なら

1.大容量の読み込みバッファを用意する
2.ファイルからバッファへ一気に読み込む
3.バッファから必要なデータの抽出
4.1へ戻る(EOFに達するまで繰り返す)

というような、seek回数を減らすコーディングをした方が高速化の効果は大きい
です。

#この辺が解ってなくて「このプログラムはCで書いてあるから遅い。アセンブラ
ならもっと速い。」というトンチンカンなことを言っている人を見たことがあり
ます。(^^;

Tschuess!

 ∧ ∧  ∩「半ばは自己の幸せを、半ばは他人の幸せを」
(・o・)_||
 |     | 石河(was 井島) 正@電算システム
 ∪ ̄∪∪ ̄∪ e-mail:i...@densan-s.co.jp
  野獣之図
30

[vcpp 00028383] CString操作って遅いのでしょうか?=B?ISO-2022-JP?B?KEo=?=

三沢です。

ファイルの操作にCStringのReadStringを使用し、1行1行読んでいます。
このデータによって、処理を行っているのですが、500K位のファイルでテストすると
かなり時間がかかっているようです。

といってもほとんどの処理は読み込んだデータを、CStringのバッファにアペンドし
ているだけなのですが・・・。もしかして、毎回オブジェクトを作っているのでしょ
うか・・・。

具体的にはこんな感じです。
CString theBuf;

theBuf += theReadData; // theReadDataは読み込んだデータ

--
_._._._._._._._._._....

   _/_/   Noriaki Misawa  m...@dti.ad.jp
  _/_/   DREAM TRAIN INTERNET INC. Planning Dept.
 _/_/   6-6-20 Akasaka, Minato-ku, Tokyo 107 Japan
_/_/   TEL +81-3-3505-8305
             ...._._ I'm @ DTI. ._._....
記事検索
Amazon.co.jp
  • ライブドアブログ