個人的なメモです.
以前 C で書いたコード(ベースは K&R 第2版 P.90 )を新しく書き換え.
少し機能も増やし,ある程度書き終えた.
既存のコードと動作速度を比べると「使えない」.チューニング前では 10 倍以上の時間.
データ内の計算式は次の様なものが多く存在する.
(((P/2-P9/2)*(P/2-P9/2))/((H9-H10-R1)*4)+(H9-H10-R1)/4)*(sin(asin(((P/2-P9/2)/2)/(((P/2-P9/2)*(P/2-P9/2))/((H9-H10-R1)*4)+(H9-H10-R1)/4))/6*5))+(P-((((P/2-P9/2)*(P/2-P9/2))/((H9-H10-R1)*4)+(H9-H10-R1)/4)*(sin(asin(((P/2-P9/2)/2)/(((P/2-P9/2)*(P/2-P9/2))/((H9-H10-R1)*4)+(H9-H10-R1)/4))/6*5)))*2)*0.982936188200278
R を求めるために同じ部分が 4 つある.
(((P/2-P9/2)*(P/2-P9/2))/((H9-H10-R1)*4)+(H9-H10-R1)/4)*(sin(asin(((P/2-P9/2)/2)/ (((P/2-P9/2)*(P/2-P9/2))/((H9-H10-R1)*4)+(H9-H10-R1)/4))/6*5)) +(P-( (((P/2-P9/2)*(P/2-P9/2))/((H9-H10-R1)*4)+(H9-H10-R1)/4)*(sin(asin(((P/2-P9/2)/2)/ (((P/2-P9/2)*(P/2-P9/2))/((H9-H10-R1)*4)+(H9-H10-R1)/4))/6*5)) )*2)*0.982936188200278
次の様な判断を加えてやっとテストになる許容範囲(前コードでは 2 秒程度で,新しいコードではその倍位).
{ if (vfp.length() <= 1) { return FERROR ; } TCHAR c_0 = vfp[0] ; if (_istupper(c_0)) { return FERROR ; } }
2020/04/13
次の様なコード(elapsetm.hxx)を追加して計測すると,データにもよるが 2 倍程度.
ElapseTime et ; v_tstring drop_files = ::DropFilesTo (hDropInfo) ; for (size_t index=0 ; index<drop_files.size() ; index++) { // ... } tstring et_str = ::To_tstring(et.GetElapse()) ;
今回の変更では一部を除き機能は省いていないと思う.また,旧コードも最低限の新しい機能を付加している.
どちらのコードも共存可能にして,旧コードが使えない場合(今後の新しいコードなど)やループ外では新しいコードを使用する様にするか?
2020/04/15
文字列の終端が正しくないバグ
次の様にする必要がある.
TcsCpy (val,bufSize,f_val.c_str()) ;
数値の小数部の 0 を省くコードで,1.00 が 1000 になってしまったバグ.
'0' を指定された時 NOP に.t_tstrng.hxx
tstring To_tstring_rz (const tstring& str,const TCHAR sp=_T('\0')) { if (sp == _T('0')) { return str ; } // ... }