節電が叫ばれる中、せっせとPCで遊んでいることに罪悪感を覚え今回は、コードの中に無駄なもの(不要なもの)がないか考えてみた。
CPUの視点から見ると・・・・
やはり一番の無駄は、不要なループ処理だと思います。本当にその処理にループ作業が必要か?または、そんなに多くのループ回数が必要か?2つの例を挙げて考えてみましょう!
合計の計算
簡単な合計計算コードを書いてみます。
-
- double SUM[100];
- double goukei;
- for(int i=0;i<100;i++){
- goukei=0;
- for(int k=0;k<100;k++) goukei+=price[i+k];
- SUM[i]=goukei;
- }
//price[]は元データ
double SUM[100];
double goukei;
for(int i=0;i<100;i++){
goukei=0;
for(int k=0;k<100;k++) goukei+=price[i+k];//このループって必要なの?
SUM[i]=goukei;
}
上記のコードだと100×100で1万回ループすることになります。
合計を算出する場合に本当にこれだけのループ処理が必要なのでしょうか?
例えば以下の様なコードにすると、
-
- double SUM[100];
- double goukei=0;
- for(int k=0;k<100;k++) goukei+=price[i+k];
- SUM[0]=goukei;
- for(int i=1;i<100;i++) SUM[i]=SUM[i-1]-price[i-1]+price[i+99];
//price[]は元データ
double SUM[100];
double goukei=0;
for(int k=0;k<100;k++) goukei+=price[i+k];
SUM[0]=goukei;
for(int i=1;i<100;i++) SUM[i]=SUM[i-1]-price[i-1]+price[i+99];
100+99で199回のループで済みます。98.01%の削減につながるわけです。
計算方法は、前回の合計から無くなる数を削除して、加わる数を足したものです。
簡単な方法ながら大幅なループの削減につながるわけです。
移動平均線の計算
EMAを使用すれば特に考える必要がありません。ちなみに、以下のコードが公式となります。
-
- double alfa
- EMA[y]=alfa*price[x]+(1-alfa)*EMA[y-1];
//price[]は元データ
double alfa//0<alfa<1のパラメータ
EMA[y]=alfa*price[x]+(1-alfa)*EMA[y-1];
SMAを使用する場合は、以下の様にするとループ数を削減できます。
-
- int period = 30;
- if(SMA[0]==0){
- double sum=0;
- for(int i=0;i<period;i++)sum+=price[i];
- SMA[0]=sum/period;
- }else{
- SMA[y]=SMA[y-1]+(price[y+period-1]-price[y-1])/period;
-
-
- }
//price[]は元データ
int period = 30;//適用期間のパラメータ
if(SMA[0]==0){
double sum=0;
for(int i=0;i<period;i++)sum+=price[i];
SMA[0]=sum/period;
}else{
SMA[y]=SMA[y-1]+(price[y+period-1]-price[y-1])/period;
//若しくは
//SMA[y]=(SMA[y-1]*period-price[y-1]+price[y+period-1])/period;
}
合計計算の応用となるわけです。
まとめ
不要な処理をPCにさせることは、『もったいない』ことだと思います。
ちなみに、『スパコン 京』で最適化処理をしたらどうなるのだろう?なんて考えてしまいます。
OSにWindowsが使われているとは考えづらいですが・・・・
長くなりそうなので今回はここまで!気が向いたらまたこの続きを書きます。
搾電?ではなく節電思考でいきたいものです。(・・?