• ベストアンサー

sscanfより速い方法について。

aid-uの回答

  • ベストアンサー
  • aid-u
  • ベストアンサー率75% (22/29)
回答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以外の部分に時間がかかっている(のを見落としている) よろしければ、確認された環境を教えてください。

qatatatfds
質問者

お礼

計測ありがとうございます。 まず環境ですが、 ・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となりました。 本来はだいぶ速い処理のようですね。。。 何か見当違いの質問をしてしまったようです。 すいません。他の部分を見てみる事にします。

qatatatfds
質問者

補足

解決しましたので、ここにて説明します。 今回はtextBufが100M近くありました。 これが原因だと考え、これを行ごとに別の 文字列に区切った後にsscanfに渡したところ 先ほどの実験程度の速度がでました。 いわゆるペンキ塗りのアルゴリズムに 起因する原因だったようです。 皆様、ご協力ありがとうございました。

関連するQ&A

  • 3d 法線ベクトル計算 

    3dのポリゴンの法線ベクトルを算出するプログラムなんですが 以下のプログラムに間違っている部分はあるでしょうか 何度か試してみたのですが何度か0で除算したりしてしまいます 渡す数字が悪いのか、プログラム自体が間違っているのかわかりません 少し助けてください //法線ベクトル計算開始 x1=1つめの頂点のx座標 y1=1つめの頂点のy座標 z1=1つめの頂点のz座標 x2=2つめの頂点のx座標 y2=2つめの頂点のy座標 z2=2つめの頂点のz座標 x3=3つめの頂点のx座標 y3=3つめの頂点のy座標 z3=3つめの頂点のz座標 x4=x2-x1 y4=y2-y1 z4=z2-z1 x5=x3-x1 y5=y3-y1 z5=z3-z1 x6=y4*z5-y5*z4 y6=x4*z5-x5*z4 z6=x4*y5-x5*y4 //正規化 er=sqrt(x6*x6+y6*y6+z6*z6) x6=er*x6 y6=er*y6 z6=er*z6 //終わり /法線ベクトル計算

  • C言語におけるtxtファイルの読み込みと出力

    環境:WinXP,Borland C++compiler 以下のようなプログラムを考えました。 ・sample.c #include <stdio.h> float func(float x,float y,float z); int main(void) { float x,y,z; scanf("%f",&x); scanf("%f",&y); scanf("%f",&z); printf("%f",func(x,y,z)); return 0; } float func(float x,float y,float z) { return x+y+z; }//ここまで。 例えば(x,y,z)=(1,2,3)と入力すると6が出力されます。 このプログラムを、任意のn組の(x,y,z)の記述されたテキストファイルを読み込んで出力outを計算し、別のテキストファイルにn組の(x,y,z,out)を書き込むようにするにはどのような変更を加えればよいのでしょうか。 具体例は以下のような感じです。用意しておいたinput.txtをsample.cで読み込んで計算し、また作成されていないoutput.txtに出力するのが目標です。 (n=3の場合) ・input.txt //x y z 1 2 3 1 8 9 -1 7 5 ・output.txt //x y z out 1 2 3 6 1 8 9 18 -1 7 5 11

  • matlabのエラー

    座標データが書き込まれたテキストファイルからデータをmatlabで読み込みたいのですが,作成したスクリプトでエラーが出ます.テキストファイルの形式はx,y,z座標がスペース区切りで1行ごとに書き込まれてます.以下作成したスクリプトです. path='coordinate.txt'; fid=fopen(path,'rt'); while feof(fid)==0 Line=fgets(fid); zahyou=sscanf(Line,'%f%f%f'); x(i)=zahyou(1); y(i)=zahyou(2); z(i)=zahyou(3); end fclose(fid); これを実行すると次のエラーメッセージが出ます. Attempted to access (1); index out of bounds because numel(zahyou)=0. エラーが出てるのはx(i)=zahyou(1)で,何がいけないのかさっぱりわかりません. さらにわからないことに,whileをなくして,一番最初の一行だけ読むときは,普通に動きます. 何がいけないのでしょうか.

  • C言語(条件処理)

    二つの球の接触を判断するプログラムを作るという宿題が出されてたのですが、if文による条件処理をどのように書けば良いか分かりません。お助けください。 接触パターンはいくつかあると思いますが、その接触するときの条件について以下のソースコードより後、どんなソースコードを追加すれば良いか教えてもらえませんか? 接触する条件を記述するだけでも良いので回答のほうを至急、お願いします。 何か間違っていれば修正のほうもお願いします。 ソースコード #include<stdio.h> int main(void) { float x1,y1,z1; //x1,y1,z1は球1の中心の位置座標 float x2,y2,z2; //x2,y2,z2は球2の中心の位置座標 //例えば(3,0,0)であれば球の中心がx軸に3の位置にいることを指す。 float r1; //球1の半径 float r2; //球2の半径 printf("x1="); scanf("%f",&x1); printf("y1="); scanf("%f",&y1); printf("z1="); scanf("%f",&z1); printf("r1="); scanf("%f",&r1); printf("x2="); scanf("%f",&x2); printf("y2="); scanf("%f",&y2); printf("z2="); scanf("%f",&z2); printf("r2="); scanf("%f",&r2); この部分の追加をお願いします。 if(){ printf("接触した"); } else{ printf("接触していない"); } return 0; } もしくは r1とr2を入力ではなく、初期化したほうが良いのでしょうか?・・・ そうであれば、修正のほうもお願いします。

  • 2次関数と2次方程式

    f(x)=x^2+2ax+5、g(x)-x^2+(a-1)x-5 がそれぞれの条件を満たすようなaの範囲を求めよ。 (1)すべての実数xに対してf(x)≧g(x)が成り立つ (2)すべての実数x、x´に対してf(x)≧g(x´)が成り立つ (1)の場合f(x)-g(x)の判別式が0以下または頂点のy座標が0以上でaの範囲がでますよね? (2)はf(x)の頂点のy座標≧g(x´)の頂点のy座標で出るのですか? 考え方のみで結構です。

  • 正四面体 第4の頂点

    正四面体の3つの頂点の座標がA(2,-1,3) B(5,2,3) C(2,2,0)であるとき、第4の頂点Dの座標を求めよ。という問題で疑問がわきました。 Dの座標を(x,y,z)とする。 自分は、AD²=BD²=CD²より (x-2)²+(y+1)²+(z-3)²=(x-5)²+(y-2)²+(z-3)² から x+y=4 (x-5)²+(y-2)²+(z-3)²=(x-2)²+(y-2)²+z² から x+z=5 (x-2)²+(y-2)²+z²=(x-2)²+(y+1)²+(z-3)² から y-z=-1 これらを連立方程式を解くようにしたら、0=0となり、答えが求まりませんでした。 問題集では、 正四面体一辺の長さはAB=|AB→| (ABベクトルを左のように書かせてもらいます。)|AB→|=√(5-2)²+{2-(-1)}²+(3-3)²=√18 ゆえにAD=BD=CD=√18 すなわち AD²=BD²=CD²=18より、x+y=4とx+z=5を(x-2)²+(y+1)²+(z-3)²=18に代入してxの2次方程式 x²-6x+5=0を解いて答えをだしています。 なぜ自分の使った連立方程式では解けないかを説明してください。お願いします。

  • 深度画像をクラスとして定義する方法について教えて

    VS C++2010を用いて、kinect for Xboxから読み取った深度画像(IplImage *SdepthImg)の データをクラスにする方法を教えていただけないでしょうか。 以下のソース[1]として定義しております。また、深度画像をこのクラスに入れて、以下のソース[2]を用いて深度画像の3次元座標情報を入手するつもりです。 クラスの定義は [1] class Object { private: int regionNumber; bool isTarget; bool isNotTarget; int probTarget; char objectName[128]; char objectClassName[128]; //オブジェクトだけの画像 IplImage *ObjImg; IplImage *ObjDepthImg; IplImage *ObjMaskImg; IplImage *ObjDepthMaskImg; //シーンの中での画像 IplImage *maskImg; IplImage *depthmaskImg; //オブジェクトの3次元点群 float *X_points; float *Y_points; float *Z_points; Vector3D center3D; Vector3D center3D_R_CORD; Vector3D volume3D; std::vector<int> color; std::vector<int> material; std::vector<float> material_likely; //std::map<int,float> material; std::map<int,float> shape_primitive; float roundness; int position[4]; //↑ ↓ → ← の順に 最寄りの物体の領域 番号 ないかも知れない void makeMask(IplImage*,IplImage*,int); void calcCenterPoint(IplImage*); void makeObjImg(IplImage*,IplImage*); ・・・・・ } [2] //extract 3d points std::vector<Vector3D> Points; Points.clear(); for(int y=0;y<this->ObjDepthMaskImg->height;y++){ for(int x=0;x<this->ObjDepthMaskImg->width;x++){ if(((uchar)this->ObjDepthMaskImg->imageData[this->ObjDepthMaskImg->widthStep * y + x]) > 0){ float X = this->X_points[ObjDepthImg->width * y + x]/100.0f; float Y = this->Y_points[ObjDepthImg->width * y + x]/100.0f; float Z = this->Z_points[ObjDepthImg->width * y + x]/100.0f; if( Z > 0 ){ Points.push_back(Vector3D(X,Y,Z)); } } } }

  • UNITY Float型の接尾辞fって

    UNITYに限ったものではないのですが、Float型の接尾辞fについて Wikiやhttp://www.wisdomsoft.jp/40.html/を見てみたのですが ちょっと難しく理解できません。fってどのような時に使うのでしょうか? Vector3 構造体のコンストラクタの部分で public Vector3(float x, float y, float z)   ←となっていますが、 Vector3 v = new Vector3(765, 961, 876); ←fはついていないですし。 またUNITYのTransformで PositionをX=0.5、Y=0.5、Z=0.5とするのと、X=0.5f、Y=0.5f、Z=0.5fとするのと位置が全然違います。 分かりやすい説明、サイトなどあれば教えてください

  • 軌跡

    放物線y=f(x)の頂点の座標が(2a-2,-4a^2+12a-8)のときの頂点の軌跡を求める問題で x=2a-2.y=-4a^2+12a-8とおくのは x座標が2a-2.y座標が-4a^2+12a-8だからということでいいのですが 軌跡が求められるのはなぜですか? 簡単にでいいので教えてください。

  • 二次関数と二次不等式

    2つの不等式 X^2-X-2≧0  ・・・(1)   X^2-2X+K < 0 ・・・・(2) について、次の問いに答えよ。ただし、Kは定数とする。 (1)(1)、(2)を同時に満たす xの値が存在しないようにKの値の範囲を定めよ。 【参考書回答】 (1):X^2-X-2≧0 の解は X≦-1、X≧2 f(X)=X^2-2X+K とする。 f(X)=(X-1)^2+K-1 より y=f(X) のグラフの頂点のX座標は 1 である。 (1) 求める条件は f(2)≧0 である。 よって、 ∴ K≧0 ■■■■■■■■■■■■■■■■■■■■■■■ 私の答えはこの上記の参考書の回答に(2)式の頂点のy座標= -1+K <0 すなわち、K<1 を加えた。 ∴ 0≦ K <1 になりました。 ここで質問です。 頂点のy座標= -1+K <0 は回答に必要ないのでしょうか? 理由は(2)式の頂点のy座標がx軸より下にないといけないと 思ったからです。