|
2.14.3 日付と時刻の関数

日付と時刻の参照
現在の日付と時刻を調べる.
In[1]:= Date[ ]
Out[1]= 
関数Dateを使うと,オペレーティングシステムの管理する現在の日付と時刻を得ることができる.Dateは夏時間の調整等はオペレーティングシステムにおいてすでに行われていることを前提とする.さらに,オペレーティングシステムレベルで適当な時刻帯が選択済みであることを前提とする.
時刻帯を参照するにはTimeZone[ ]を使う.時刻帯の値はローカル時からグリニッジ標準時(GMT)を差し引くことで得られる時間差を示す.例えば,米国東部標準時間(EST)ならば,この値は になる.また,夏時間は時刻帯の値に含まれるので,米国東部夏時間(EDT)なら値は になる.
コンピュータで使われている時刻帯を参照する.
In[2]:= TimeZone[ ]
Out[2]= 
+9の時刻帯における現在の時間を参照する.日本の標準時に相当する.
In[3]:= Date[9]
Out[3]= 

時間に関する関数
オペレーティングシステムの時間管理は一定間隔で行われている.この時間幅は$TimeUnitを参照することで知ることができる.通常,この値は 秒あるいは 秒程度に設定される.

計算中の一時停止
各種の時間情報を調べる.
In[4]:= {AbsoluteTime[ ], SessionTime[ ], TimeUsed[ ]}
Out[4]= 
10秒待ってから,時間情報を取得する.待機しようがしまいが,TimeUsed[ ]の返してくるCPU時間は同じことに注目.
In[5]:= Pause[10]; {AbsoluteTime[ ], SessionTime[ ], TimeUsed[ ]}
Out[5]= 

日付情報と絶対時間の変換
日付を調べ,dに取っておく.
In[6]:= d = Date[ ]
Out[6]= 
現在の日付に1ヶ月割増しする.
In[7]:= Date[ ] + {0, 1, 0, 0, 0, 0}
Out[7]= 
1ヶ月間に相当する秒単位の時間を計算 する.
In[8]:= FromDate[%] - FromDate[d]
Out[8]= 

評価時間の計測
式の評価にどれだけの時間がかかるかを知りたければ関数Timingを使う.この時間はTimeUsedに保持されるCPU時間の増分に相当する.注意してほしいが,Timingは式評価のためにカーネルが使ったCPU時間だけを計測する.出力への書式適用や外部プログラムで使った時間は含まれない.
AbsoluteTimingを用いて絶対的な経過時間を計測することができる. AbsoluteTimingで計測される時間もTimingで計測される時間も評価される式だけではなく,環境条件によっても違ってくるので注意が必要である.
第一に,使用時間は使っているコンピュータの機種やオペレーティングシステムに依存する.CPU処理の速度だけでなく,メモリキャッシュの設定等にも依存する.また,言うまでもないが,計算で使われるカーネルの内部コードに使われているコンパイル時の最適化処理の詳細にも依存する.
さらに,計測対象となる計算が行われているときのセッション状態にも使用時間は依存する.これは,実時間的にカーネルが採用する計算の最適化法の多くは前の計算結果に依存する形で選定されるためである.例えば,計算を進める上で,カーネルは前に取得した結果を保持しておき同じ式が現れたなら不必要には再評価をせず,保持した結果を呼び戻す,というような処理がよく行われる.さらに,組込み関数によっては,最初に呼び出したときに内部に値のテーブルを作成しておき,再度同じ形式で呼出しがあったときにはそのテーブルを参照することで実行に必要な時間を短縮する,というような処理が行われる.このような理由から,同じ式を繰り返し計算させても,セッションの現況が違うため,前とは違った時間が計測されることもしばしばある.
計算に費やしたCPU時間を見る.計算結果自体は表示しないようにセミコロンを付け足しておく.
In[9]:= Timing[100000!;]
Out[9]= 
同じ階乗を計算する.前回の計算で内部テーブルができているので,計測できるほどのCPU時間はかからない.
In[10]:= Timing[100000!;]
Out[10]= 
しかし,全体時間はある程度計測できる.
In[11]:= AbsoluteTiming[100000!;]
Out[11]= 
Timingにより計測される時間は,使われるコンピュータによっても違うが,ある最小時間幅 ($TimeUnit)までの精度でしかないことに注意すること.例えば,0〜$TimeUnitの間の時間ならすべて0として報告されてしまう.

計算時間の制限
対話的に計算を進める場合,非常に長い時間がかかるようならば手動で計算を途中で止めたいことがある.TimeConstrainedを使えば,プログラムの中から自動的に計算を強制的に中止することが可能になる.TimeConstrainedで指定した時間内に式の評価が終了しない場合は,評価は中断され,$Aborted (もしくは,特別指定した式)が戻り値として返される.
TimeConstrainedを使うと,最初にある計算法で問題を解かせてみて,時間がかかるようならば,別の方法を試してみることも可能である.ただし,設定した時間が経過しても計算が中断しない場合もあるので注意が必要である.このような状況はカーネルが中止不可の計算部分を処理しているときに起る.さらに,同じTimeConstrainedの指定をしても,違うコンピュータで評価した場合,結果が違ってくることがある.
|