Iwao Dev

気付いたことをメモしています.

この画面は、簡易表示です

2020/04/11

計算式で時間が …

個人的なメモです.


以前 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()) ;
次の様にする必要がある.
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 ;	}
	// ...
	}
この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ



    top

    %d人のブロガーが「いいね」をつけました。