- 締切済み
関数の値を配列に格納する早さ
課題があって、膨大のデータファイルを操るプログラムに関係あります。 ファイルの中身にある値を内積を求めてRuijido関数という関数を作った。結構大きいので細かく説明するとよけい難しいと思うので問題になるところだけ書かせてもらいます。43000個の類似度の値を計算する部分は以下のとおり: (1)以下のプログラムを書いたら処理する時間が5分 for(i=1; i<43000; i++){ if(i==indexNum){ i++; } gainenComp[count] = Ruijido(indexNum,i); indx[count] = i; count++; printf("gainenComp[%d]:%f\n",count,gainenComp[count-1]); } (2)以下のプログラム書いたら処理時間10分(どれもひどいですT.T) for(i=1; i<43000; i++){ if(i==indexNum){ i++; } rVal = Ruijido(indexNum,i); if( rVal>0.800000){ gainenComp[count][0]= rVal; gainenComp[count][1] = i; count++; } } 関数の呼び出す時間かなり影響してくるんですか?(2)番目のところに見ると類似度関数を2回呼び出されるため、処理時間が2倍増えたと自分が思うんですが...どうしたら関数の値を配列に格納するのにすばやく処理できますか? (質問わかりづらいと思いますがどうかよろしくおねがします)
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Interest
- ベストアンサー率31% (207/659)
関数の戻り値を配列に格納すること自体は処理速度に影響をほとんど及ぼしませんから、今回の問題はそこじゃないと思います。 > 関数の呼び出す時間かなり影響してくるんですか? 私は、Ruijido関数の「処理時間」が問題なんじゃないかと思います。 この Ruijido関数が何をやっているか気になります。 5分で43000回のループでということは、このRuijido関数の処理でおよそ7ms程度かかっているということですよね。7msってCPUから見るとかな~~~~~り長いですよ。差し支えなければ、このRuijido関数の中身も見せてください。そうすればもう少し踏み込んだアドバイスができるかと思います。 また、開発環境は何を使っているかわかりませんが、統合開発環境のデバッガやclock関数、gettimeofday関数などを使ってRuijido関数の処理にの程度時間がかかっているか計測してみてはいかがでしょうか。 ちなみに、printfはデバッグ用だと思いますが、非常に重たい処理ですので処理速度を稼ぎたいのであれば入れない方が得策です。
- SilverThaw
- ベストアンサー率32% (260/806)
※インデントを整理してみました (1) for(i=1; i<43000; i++) { if(i == indexNum) { i++; } gainenComp[count] = Ruijido(indexNum,i); indx[count] = i; count++; printf("gainenComp[%d]:%f\n",count,gainenComp[count-1]); } (2)以下のプログラム書いたら処理時間10分(どれもひどいですT.T) for(i=1; i<43000; i++) { if(i == indexNum) { i++; } rVal = Ruijido(indexNum, i); if( rVal > 0.800000 ) { gainenComp[count][0]= rVal; gainenComp[count][1] = i; count++; } } まず確認ですが、(1)は > indx[count] = i; > count++; ではなく、 if( gainenComp[count] > 0.800000 ) { indx[count] = i; count++; } が正しいのでは? >(2)番目の2回呼び出すと思われる部分は: 「呼び出し」と言う単語では、一般的にはRuijido()の「関数の」呼び出しをさします。 >gainenComp[count][0]= rVal; >gainenComp[count][1] = i; のことであれば、配列への「代入」であり、呼び出しとは言いませんよ。 ソースからわかることは、 if()文があるのでその分(コード量が増える)=速度に若干ながら影響する。 gainenComp[]の持ち方が違うので、単純に比較できない。 ということくらいですね。 試しに、 ・(1)のgainenComp[]を(2)と同じ宣言にし、 gainenComp[count] = Ruijido(indexNum,i); を gainenComp[count][0] = Ruijido(indexNum,i); にする。 ・(2)のif文を外して実行 を行ったらどうなります?
- asuncion
- ベストアンサー率33% (2127/6289)
>(2)番目のところに見ると類似度関数を2回呼び出される 2回というのは、どれとどれのことですか? (1)も(2)も、Ruijido関数は1回ずつ実行しているように見えます。 当方の見間違いでしょうか?
補足
(2)番目の2回呼び出すと思われる部分は: 1.rVal = Ruijido(indexNum,i); if( rVal>0.800000){ 2.gainenComp[count][0]= rVal; gainenComp[count][1] = i; count++; } 違うでしょうか?
補足
配列への「代入」するですね、;p どうもすみませんでした。 (1)は for(i=1; i<SIZE; i++){ gainenComp[i] = Ruijido(indexNum,i); indx[i] = i; i++; printf("gainenComp[%d]:%f\n",i,gainenComp[i-1]); } というふうにわざと書き直しました。(1)と(2)のソースコードは処理時間の比較するため別々に保存して置きました。類似度の値は0.8以上という条件入れずにしました。 すみませんわかりづらいですね。