applescript Memo 02

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 "全車一斉にスタート!!\nAが一気に外から伸びてきた!AD\nそしてBはアウトコースに出ようとしている!アウトコースに出た!\nD!そしてAAきたっ!内のほうでC頑張っている!\nC頑張っている!DDAAきたっ!\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の文字列のクウォート。

なので実際は''のスクリプトを実行していることになる。

\は単にエスケープシーケンスだから…

色文字とっぱらってステートメントごとに改行すると。

 

 

1perl -e

2use Time::HiRes qw(gettimeofday);

3my($sec,$microsec)=gettimeofday();

4print $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 していこうと思う。