From: Tadayoshi Funaba Date: 2000-07-06T17:56:56+09:00 Subject: [ruby-dev:10247] Re: date/date2 ふなばです。 At 2000-07-06T15:26:09+0900 (2451731.76816JD), matz@netlab.co.jp (Yukihiro Matsumoto) wrote: matz> あとよく分からないのは現dateのアルゴリズムとdate2のアルゴリ matz> ズムの違いについてです。date2のアルゴリズムの方が「ちゃんと matz> した」文献にのっとっているという点以外には性質の違いとかはさ matz> ほどないのでしょうか。 何故に、突然アルゴリズムの違いに興味を持たれたのか判らないので、適切な 回答になっているか判りませんが...。 date は、基本的には素朴なのだと思います。たとえば、月日を決定するのに 表とループをつかいます (あまり速くはないでしょう)。その素朴なコードに、 改暦のための調整のコードがその場しのぎ的に覆い被さっている (鏤められて いる) 感じです。そのため見通しがわるく、バグの原因にもなっていました。 もし英国以外の改暦にも対応しようすれば、完全に破綻するでしょう。date2 のほうは、もとから改暦というものが意識されたつくりなのです。 date2 のもともとのアルゴリズムは、天文計算を意識したもので、じつは、端 数にも意味があるとか、そういうことも関係ありますかね。date2 としては、 基本的に関係ないことになっていますが。 date は、ひとつひとつは素朴なんですが、絡みあっているというか、ツギハ ギされている感じです。それが色々な問題の原因にもなっていたと思います (今は、以前よりはよくなった、と思います)。よくないと思います。 仮令、アルゴリズムはよしとしても、date の仕様は解せません。 Date.period! や Date.jan! という名前はよくないです。Date.period! があ るなら、その逆のクラスメソッドもあってよいはずです。Date.leapyear は、 その名前から推測される機能とは全く異なります。 僕は、date のコードは、もともとライブラリとして設計されたものでなく、 たんなるアプリケイションの下請けコードとして生まれたのだと理解していま す。性質の違いの元は、このへんにもあるのかもしれないです。 matz> 簡単なベンチマークではdateの方がわずかに速いようですが。 んー、そうですか? どういうのでしょう? たしかに、ごく簡単なものでは、 そうなんですが、今のところ、あまり気にしなくてもよいと考えています。も ちろん、理由なく遅いのはまずいですが、そういうところがあれば、直したい と思います。 暦計算そのものは、odate や date2 のほうが速いと認識しています。引数チェッ クとか、ちょっと違っていて、そのあたりが遅いことはあるかもしれません。 あと、簡単でないものでは、date はかなり遅いと思います。日付でループを 組む、日付の加減算、比較演算、日付でソートをする、すべて遅いでしょう。 僕自身も date2 のすべてに満足しているわけでないけど、仕様変更はもう遅 いですよね :) ふなば ただよし