ただいま、テキストから書式付のデータを取得するコードを
書いております。
しかし、異常にその処理が遅いので、原因を調べてみると
どうやらsscanfが原因らしいということが分かりました。
問題の箇所は以下のようになっております。
char*textBuf = NULL
・・・
(textBufにテキストの内容をロード)
・・・
for(int i=0;i<vertexNum ;++i )
{
float x, y, z;/*頂点座標になります*/
/*どうやらココが遅いようです。*/
sscanf( textBuf, "%f %f %f", &x, &y, &z );
vertexs_.push_back( Vector3(x, y, -z) );
textBuf = nextLine(textBuf);/*次の行に進みます。*/
}
テキストには座標が格納してありそのフォーマットは
0.0 1.4 5.4
7.1 4.2 2.3
・・・
のようになっております。
上記の方法では5000頂点の取得に12sec近くかかり
とても使用に耐えられません。
何か解決方法をご存知の方がいらっしゃいましたら
ご教授よろしくお願いします。
No.7ベストアンサー
- 回答日時:
環境が記述されていないのですが、どのような環境で確認されたのでしょうか。
手元の環境でsscanfを5000回繰り返すだけのプログラムを作成し、
時間を計測しましたが0.1秒もかかりませんでした。
環境は以下の通りです。
・Windows XP上のVMWare PlayerでUbuntu 8.04を動作
・CPUはT2300@1.66GHz
・メモリは512MB
・コンパイラはgcc 4.2.3
見ていただいて分かると思いますが、性能が期待できる環境ではありません。
この環境で0.1秒かからないものが、12秒かかるというのは以下のどちらかではないかと思います。
・通常のPCではない(組み込み系?)の環境
・sscanf以外の部分に時間がかかっている(のを見落としている)
よろしければ、確認された環境を教えてください。
この回答への補足
解決しましたので、ここにて説明します。
今回はtextBufが100M近くありました。
これが原因だと考え、これを行ごとに別の
文字列に区切った後にsscanfに渡したところ
先ほどの実験程度の速度がでました。
いわゆるペンキ塗りのアルゴリズムに
起因する原因だったようです。
皆様、ご協力ありがとうございました。
計測ありがとうございます。
まず環境ですが、
・OS:xp sp3
・cpu:athlon 64×2 4400+ (2.31G Hz)
・コンパイラ:VC9
・メモリ:1G
至って普通の環境ですね。。。
もっと小さい状況にしてみようと思い
#include <cstdio>
#include <stdlib.h>
#include <windows.h>
#pragma comment(lib, "winmm.lib")
int main()
{
const char*data = "0.15487 0.488949 1.54897";
char*dataHuge = new char[1024*128];/*128MB*/
memset(dataHuge, 0, sizeof(char)*1024*128 );
strcpy(dataHuge, data);
long start = timeGetTime();
for(int i=0;i<5000;++i)
{
volatile int x, y, z;
sscanf(dataHuge, "%f %f %f", &x, &y, &z);
}
long elapse = timeGetTime() - start;
printf("time:%f\n", (float)elapse*0.001f);
delete []dataHuge;
}
としたところ、0.05secとなりました。
本来はだいぶ速い処理のようですね。。。
何か見当違いの質問をしてしまったようです。
すいません。他の部分を見てみる事にします。
No.6
- 回答日時:
文字列→浮動小数点変換の重い内部処理ロジックはほとんど同じなのでsscanfで遅いものがstrtodで早くなるとは思えません。
このままだと解決しない可能性が高いので、どうして12秒掛かったらマズイかを教えてください。根本的な仕様が間違っている気がします。操作性が悪くなるとか、5秒ぐらいで処理しないと何かに間に合わないとか使用に耐えれない詳しい理由をお願いします。
この回答への補足
申し訳ありません。その点も説明不足でした。
まずこれはゲームに利用するモデルデータの
読み込みを行う部分になります。
最終的には2~3万頂点前後の処理を行う予定なのですが、
上の結果だと48秒以上かかってしまいます。
(頂点の他に面の情報も取得しなければならないので状況は
もっと悪くなります)
「NowLoading」を流せばいい問題(?)でもあり、
明確に何秒だから不味いというものでもないのですが、
1分近い間待たせるのもいかかがなものか思っています。
最初の段階で、一秒かからない処理だと思ったものが
10秒以上かかってしまったために、酷く重大な欠陥があるような
気がしたため、質問したというのもあります。
あと、strtod,atofに関してですが、おっしゃるとおり全く速度に影響が
ありませんでした。(詳しく図ればsscanfの方が速そうですが)
私も今は根本的な部分にミスがあると思います。
もう少しだけ回答を募ったらあきらめて、
他の手段を模索しようと思います。
No.4
- 回答日時:
>#3さん
>ディスクからの読み込みは遅いのでforループを5000回繰り返せば遅くなります。
くだんのforループの中でディスクからの読込みを行なっているわけではなさそうです。
>(textBufにテキストの内容をロード)
の箇所は、くだんのforループの外にあります。
No.2
- 回答日時:
>しかし、異常にその処理が遅いので、原因を調べてみると
>どうやらsscanfが原因らしいということが分かりました。
原因を調べた方法を教えてください。
この回答への補足
申し訳ありません。説明不足でした。
検証方法ですが、
単純に
vertexs_.push_back( Vector3(x, y, -z) );
textBuf = nextLine(textBuf);/*次の行に進みます。*/
を取り除き
sscanf( textBuf, "%f %f %f", &x, &y, &z );
だけの速度を計測しました。(for(int i=0;i<vertexNum ;++i )の分だけ)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- 宅地建物取引主任者(宅建) 宅建の学習 テキストを読み一問一答の過去問を解く、これを続けてるのですが成果が分らずにいます 1 2022/07/29 10:43
- その他(職業・資格) 高卒認定試験の勉強法、難易度について 2 2023/04/04 00:01
- 宅地建物取引主任者(宅建) 宅建は本当に一冊のテキストと問題集で合格できるのでしょうか? 4 2023/07/15 20:38
- 大学受験 国立受験 11月からの大逆転劇を起こすには 7 2022/11/14 19:24
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- 大学受験 資格試験などの勉強で過去問題集の解説を理解する時、分からない用語を調べてどうするのが良いですか? 問 3 2023/06/18 17:18
- 国家公務員・地方公務員 公務員試験の数的処理で苦戦しています。 1 2023/01/30 08:56
- 簿記検定・漢字検定・秘書検定 簿記検定3級について 最近、簿記の3級の資格を取ろうと思っているのですが、基本の説明+基本問題が1個 1 2022/10/02 12:49
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
Escキーを押すと、中断する時と...
-
DoEventsが必要な理由について
-
VBAでの一時停止と再開の方法
-
ListBox 複数選択 で オートフ...
-
VBA for i=1 to lastrow
-
イベントの発生を待つ
-
乱数の桁数指定、または範囲指定。
-
Do whileでExitせず、ループの...
-
ループフリー
-
UWSCの終了の仕方
-
null 参照の例外が実行時に発生...
-
pythonでファイルのコメント行...
-
sscanfより速い方法について。
-
レインボー色ってどうやって表...
-
GIFアニメをループさせたくない
-
WHILE (CHKIMG(”A.bmp”)=FALSE)...
-
範囲指定したセルを1つずつ飛...
-
.htaccessがループしてる?それ...
-
エディットボックスのテキスト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
UWSCの終了の仕方
-
DoEventsが必要な理由について
-
VBAでの一時停止と再開の方法
-
Escキーを押すと、中断する時と...
-
範囲指定したセルを1つずつ飛...
-
DOSコマンドのループ内のTIMEコ...
-
vb.netからエクセル関数書き込み
-
vb.netです。2次元配列の要素を...
-
VBAで3秒だけ時間を止めたい
-
アクティブセルから、A列最終行...
-
VBA for i=1 to lastrow
-
Do whileでExitせず、ループの...
-
乱数の桁数指定、または範囲指定。
-
CSVファイルの特定の行だけを読...
-
VB2010でCSVファイルの読み込み
-
テキストボックスの名前に変数...
-
UWSCに制限時間を付けたいです
-
イベントの発生を待つ
-
ボタンが押された時にループか...
おすすめ情報