天体暦高速化

2013-10-25の件

>・表示が遅い
>オフラインでの計算に比べて一桁長い時間がかかります。計算以外に余分な
>処理が発生しているのだと思いますが確認中です。

一桁長いというのは要するに9割無駄な処理が走っているということですが、
どうもこれはガベッジコレクションが原因のようです。

天体暦の計算では TZInfo を利用して時差を求めるのに When::TM::DateAndTime
クラスのオブジェクトを大量に生成しています。これは計算が済めばいらなくなる
ので、ガベッジコレクションの対象になります。コマンドラインからオフラインで
テストプログラムを動かす場合とは異なり、Ruby on Rails でメモリに常駐している
状態では、天体暦の計算以前にすでに大量のオブジェクトが存在しているため、
ガベッジコレクションに余計に時間がかかるのではないかと思われます。

時差の計算アルゴリズムを見直して生成するオブジェクトの数を減らしただけで、
9割のうち7割の部分がなくなり、処理速度が3倍になりました。しかし、まだ
本来よりも約3倍も時間がかかっているわけです。これをさらに改善するには、
多岐にわたるオブジェクト生成状況の確認が必要と思われ、一度ここで保留に
しようと思います。

>・秒の表示が余分
>慣習として秒を29捨30入して分のオーダーまでの表示とするべきなのですが、
>現状は計算結果を秒未満切り捨てて表示しています。原則切り捨てないと
>23時59分30秒が翌日になってしまうからなのですが、対応を検討中です。

切り捨てを丸めに変更するには、丸め単位の半分の長さだけ進んだ日時の切り
捨て結果を出力すれば良いわけですが、これをやると計算時間がさらにのびます。

今回は、http://hosi.org:3000/cookies に、Round Event Time という項目を
追加し、切り捨て(Non)か丸め(Minute, Second)を選択できるようにしました。
デフォルトは、以前と同様切り捨てとします。

なお、上記の何れについても、ライブラリへの反映は Rubygems の次回登録時点
までお待ちください。

この記事へのコメント

この記事へのトラックバック