掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
double型配列に格納されたデータを入出力するには (ID:55089)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
すでに1ヶ月くらい経過していますが。(^^;; 解決ボタンもないことですし。 for にしてもネストが深くてはあまりきれいには見えませんね。 ということで美しく書くことに徹してみます。 ループの中身を変えてオーバヘッド測定をしてみました。 プログラムは下にあります。 結果: ( Pentium4 1.9GHz Win2K, VC++6.0 ) // 主として while( vc ) のオーバヘッド ループ内が a = b; のみのとき 3154ms // sprintf() のオーバヘッド sprintf( s, "%lf", a = b ); のとき 222281 ms. // 添え字アクセスのオーバヘッド( memory cache swap 込み) a = vv[vc[10]]...[vc[0]]; のとき 38611 ms. // I/O 込みのオーバヘッド fprintf( fp, "%lf\r\n", a = b ); のとき 243148 ms. // 現実に近い形 ... 94878 ms. fprintf( fp, "%lf\r\n", a = vv[vc[10]]...[vc[0]] ); ここでなぜか値が小さいが、vv[]..[] の内容はほとんど0であるため 書式生成のオーバヘッドがほとんどないためであることが判明。 // 検証 ... 88181 ms. sprintf( vs, "%lf\r\n", a = vv[vc[10]]...[vc[0]] ); // なおバイナリで保存すると... 47514 ms. fwrite( &vv[vc[10]]...[vc[0]], 1, sizeof(double), fp ); // やはり一括で保存するのが早いだろう ... 10790 ms. ループせずに fwrite( vv, 1, sizeof(vv), fp ); 結論: sprintf()で有効な値を持つdoubleを書式変換すると重くなる。 loopvec クラスの使用も for ループに比べれば明らかに遅いが、 思ったほど遅くもなさそうだった。スピードの要求されないところには きれいな表記のために使用しても良さそうだと思われる。 int vec[] = { 7,3,5,5,5,5,5,5,5,5,5 }; loopvec vc( vec,11 ); while( vc ) // ループは一重(ひとえ)ね。 { vc[0],vc[1] ... } でも、やはりバイナリで一括保存するのは早い。 サフィックスの vc[n] が汚いかもしれない。 さて、みなさんの評価はいかがなりや? ----------------------------------------------------------- #include "loopvec.h" double vv[5][5][5][5][5][5][5][5][5][3][7]; void CDblmemDlg::OnSaveFile() { CTime et,st = time(NULL); CTimeSpan dt; double a = 0.0, b = 2.33; int vec[] = { 7,3,5,5,5,5,5,5,5,5,5 }; loopvec vc( vec,11 ); __int64 s,e; FILE * fp; if( fp = fopen( "E:\\tempfile.txt","wb" )) { s = qpc(); while( vc ) { fwrite( &vv[vc[10]][vc[9]][vc[8]][vc[7]][vc[6]][vc[5]][vc[4]][vc[3]][vc[2]][vc[1]][vc[0]], 1, sizeof(double), fp ); } e = qpc(); fclose( fp ); } TRACE("%s\n", ed( s,e )); } ---------------------------------- 測定ツール ---- __int64 qpc( void ) // query performance counter { __int64 q; QueryPerformanceCounter( (LARGE_INTEGER*)&q ); return( q ); } char * ed( __int64 s, __int64 e ) // eval diff { static char es[272]; __int64 d, v; QueryPerformanceFrequency( (LARGE_INTEGER *)&v ); d = (( e - s ) * 1000 ) / v; sprintf( es, "%d ms.", (int)d ); return( es ); } ---------------------------------- loopvec.h ---- class loopvec { public: int * m_vec; int * m_cnt_vec; int m_nSize; bool m_done; loopvec( int * pvec, int size_by_int ) { m_vec = new int[size_by_int]; m_cnt_vec = new int[size_by_int]; memcpy( m_vec, pvec, sizeof(int)*size_by_int ); memcpy( m_cnt_vec, pvec, sizeof(int)*size_by_int ); m_nSize = size_by_int; m_done = false; } ~loopvec() { delete m_vec; } operator bool() { int c; for( c = 0; c < m_nSize; c ++ ) { if( ++m_cnt_vec[c] >= m_vec[c] ) { m_cnt_vec[c] = 0; } else { return( true ); } } if( m_done ) return( false ); m_done = true; return( true ); } operator []( int c ) { if( c < m_nSize ) { return( m_cnt_vec[c] ); } else { return( 0 ); } } }; -------------------------------
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.