rap Time
プログラムの詳細な実行速度って気になりませんか?applescriptの標準のdateオブジェクトでは、1秒以下の時間をdateオブジェクトが持っていないので、1.01秒から2.99秒までの時間差が1(秒)になってしまう。実際にはほぼ2秒の差があるのに。。
そこで、shell script から perl scriptを実行し、処理開始から終了までのミリ単位の経過時間を表示するコードを書いてみました。
ここでは「テキストエディットにカーレース実況の文字を一文字ずつ追加表示するプログラム」の実行速度を計っています。
動的な感じなんで面白いですよ、きっと。
--開始時刻をRapTimeオブジェクトから取得
set start_time to RapTime 's EPOCTimeGetter ()
--ここから
tell application "TextEdit"
--下記関数からキャラクターごとの配列を得る
set chara_list to voice_getter () of me
activate
--新規ドキュメント作成
make new document
--最前面のドキュメントにアクセス
tell document 1
--キャラクター分繰り返し、一字ずつ追加し表示する
set _text to ""
repeat with i from 1 to ( count of chara_list )
set _text to _text & ( item i of chara_list )
set text of it to _text
delay 0.1
end repeat
end tell
end tell
--ここまでに処理を書く
--終了時刻をRapTimeオブジェクトから取得
set end_time to RapTime 's EPOCTimeGetter ()
--ダイアログに表示
RapTime 's rapTimeReporter ( start_time , end_time )
--2種類のメソッドを持ったスクリプトオブジェクト
script RapTime
--現在時刻をミリ秒で返すメソッド
on EPOCTimeGetter ()
--ミリ秒までの現在時刻のを文字として代入。
return do shell script "perl -e 'use Time::HiRes qw(gettimeofday); my($sec,$microsec)=gettimeofday(); print $sec,\".\",$microsec . \"\n\";'"
end EPOCTimeGetter
--結果を出力するメソッド
on rapTimeReporter ( starttime , endtime )
activate
display dialog " 処理時間は約 " & (( endtime as number ) - ( starttime as number )) & " 秒です。 " with title "rapTimeReporter"
end rapTimeReporter
end script
--テキストを配列で返す
on voice_getter ()
return every character of "全車一斉にスタート!!\n「Aが一気に外から伸びてきた!AとD!\nそしてBはアウトコースに出ようとしている!アウトコースに出た!\nD!そしてA!Aきたっ!内のほうでC頑張っている!\nC頑張っている!D!D!A!Aきたっ!\n外のほうからB!外からB!しかしDも頑張っている!D頑張っている!\nFか!Fもきている!Dとそして外のほうから!外のほうから最強の2台!!\nやっぱり最後は2台だったぁ~~!!最後は2台~!!\n最後はやはり、最強の2台~!!\nゴールッ!!"
end voice_getter
perl部
perl呼び出し部分の自分なりの解説、shellもperlもあんまり知らないので間違っているかも
do shell script "perl -e 'use Time::HiRes qw(gettimeofday); my($sec,$microsec)=gettimeofday(); print $sec,\".\",$microsec . \"\n\";'"
"はappleScriptの文字列のクウォートで
'はshell script から呼んでいるperlの文字列のクウォート。
なので実際は'〜'のスクリプトを実行していることになる。
\は単にエスケープシーケンスだから…
色文字とっぱらってステートメントごとに改行すると。
1:perl -e
2:use Time::HiRes qw(gettimeofday);
3:my($sec,$microsec)=gettimeofday();
4:print $sec,".",$microsec . "\n";
1はshellがperl呼ぶときの常套句なんでしょう。
2「use Time::HiRes」はperlの「精密な時間を扱う」モジュールで、「gettimeofday」はんの中のメソッドで、 エポックからの秒(1970年1月1日0時0分0秒からの秒数)とマイクロ秒2つの要素の配列を返すそうです。 そいつを使うって宣言しているのでしょう。qw演算子は配列の初期化で使うらしい。要するに宣言しているパートかな?
3は2のメソッドを呼んで、変数secとmicrosecに要素を代入してるんでしょう。
4は二つの要素間を「.」でつないで文字列にしています。
applescript内に直接他言語書き込む場合のワンライナー、クウォート、エスケープシーケンスが混乱の素。こうやって読み解くと割と単純な事しているんだなと気付く。これからは他言語の便利な機能をどんどん do していこうと思う。
コメントをお書きください