Article View: fj.lang.c
Article #393Re: 教えてください ルーチンの高速化
From: Takeshi Shigihara
Date: Thu, 30 Apr 1998 00:00
Date: Thu, 30 Apr 1998 00:00
47 lines
2619 bytes
2619 bytes
leo@mxb.meshnet.or.jp wrote:
>
> 教えてください。
>
> 以下のようなプログラムを高速化するにはどうしたらいいでしょうか?
>
> long i,j,n,nn;
> double nrm,sigma;
> double cosTable[],x[],y[];
>
> for( j=1 ; j<n ; j++ )
> {
> for(sigma=i=0 ; i<n ; i++)
> sigma += x[i] * cosTable[(( 2 * i + 1 ) * j)%nn] ;
> y[j] = nrm * sigma;
> }
>
(1) 処理そのものを見直す。
→元の式にたちかえって、数式を変形するだけで処理が減らないかどうか、
考えてみる。
(2) FPUの高速なマシンならば、極力整数を利用しない。
→整数演算より小数演算の方が速いマシンも存在する。そうしたマシンでは
コサインのテーブルよりコサインそのものをFPUに計算させたほうが、
かえって速いことさえある。整数←→小数の変換に手間取るマシンも存在
する。
(2)' 小数演算を決して使わない。
→FPUの付属していないマシンの場合、小数の演算もすべてソフトウェア
でFPUの代わりに実現しているわけで、当然ながら大量の演算を必要と
する。オーバーフローや有効桁数などに気を付けながら、たとえば1000倍
の数値として全演算を行ってしまう。
(3) アセンブラですべてを書き換える。
→コンパイラよりも、ずっと上手にアセンブラを使える状況でない限り、
逆に遅くなってしまうことさえある。
(4) 高速なマシンを利用する。
→当然ながら、今より速くなる。
他にも方法はあることでしょうが、まぁ、このくらいをあげておきます。
小手先のテクニックなんぞより、(1) が、大きな効果を生むことでしょう。
すでに数式が極限まで簡略化されており、それでも高速化しなければならない
としたら、小手先のテクニックが有効となります。
----- Takeshi Shigihara
Office cygnus@masternet.or.jp
Home cygnus@po.jah.ne.jp -----
Technical Details
Message-ID:
<3547EB83.F35FD43E@masternet.or.jp>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<35467E52.545A@mxb.meshnet.or.jp>Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS X-Google-Thread: 106434,5daf7c1d07ca6629 X-Google-Attributes: gid106434,public From: Takeshi Shigihara <cygnus@masternet.or.jp> Subject: Re: 教えてください ルーチンの高速化 Date: 1998/04/30 Message-ID: <3547EB83.F35FD43E@masternet.or.jp> X-Deja-AN: 348947774 Content-Transfer-Encoding: 7bit References: <35467E52.545A@mxb.meshnet.or.jp> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-2022-jp X-Complaints-To: ap-net@asahi-net.or.jp X-Trace: skytrain.asahi-net.or.jp 893906087 24412 (None) 202.224.45.147 Organization: MasterNet Newsgroups: fj.lang.c