
ただいま、テキストから書式付のデータを取得するコードを
書いております。
しかし、異常にその処理が遅いので、原因を調べてみると
どうやら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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UWSCの終了の仕方
-
<select size='7' multiple>...
-
プログラミングについて。 1つ...
-
ListBox 複数選択 で オートフ...
-
なぜⅰなのか?
-
「シにたい」って文字にして言...
-
Do ~ Loopの文字列条件
-
VBAコードでメッセージがうまく...
-
servletからjspへ戻った後のラ...
-
sscanfより速い方法について。
-
プログラミングの流れ図の問題...
-
【緊急】VisualBasicのマルチタ...
-
VBのFor構文の中で、Cのnextの...
-
JavaマルチスレッドでSleepを使...
-
組んだプログラミングの全体の...
-
VBA for i=1 to lastrow
-
COBOLプログラム
-
モンテカルロ法
-
USWCの使い方をおしえてください
-
このマクロの繰り返し?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
流れ図(フローチャート)が分か...
-
CSVファイルの特定の行だけを読...
-
範囲指定したセルを1つずつ飛...
-
VBAでの一時停止と再開の方法
-
乱数の桁数指定、または範囲指定。
-
VBA for i=1 to lastrow
-
VBAで3秒だけ時間を止めたい
-
vb.netです。2次元配列の要素を...
-
エクセルの当番表を作っていま...
-
vb.netからエクセル関数書き込み
-
DOSコマンドのループ内のTIMEコ...
-
「偶数・奇数の和」のフローチ...
-
GIFアニメをループさせたくない
-
Do whileでExitせず、ループの...
-
VB2010でCSVファイルの読み込み
-
【VBA】全て空白のセルの列の非...
-
アクティブセルから、A列最終行...
おすすめ情報