« [REALbasic]特定のアプリケーションプロセスの存在の有無をAppleEventで確認する in Mac OS X | Main | [REALbasic]続・SafariをREALbasicからAppleEventで操る »

2005.08.18

[REALbasic]AppleEvent VS. AppleScriptどっちが速い?

AppleEventで実装した処理と、AppleScriptをプロジェクトに埋め込んだ場合とで、どれほどパフォーマンスに差が出るのか、簡単に調べてみた。

比較した処理は、Safariから表示ページのsourceを取ってきて、EditFieldに表示するというもの。

■AppleScript陣営

dim s1 as double
dim s2 as double

s1 = microseconds
EditFIeld1.Text = getsource
s2 = microseconds
editfield3.seltext = "AppleScript:" + chr(9) + str(s2 - s1) + chr(10)

※getsource.scrptの内容

on run {}
tell application "Safari"
tell document 1 to source
end tell
end run

■AppleEvent陣営

Dim ae as AppleEvent
Dim obj as AppleEventObjectSpecifier

Dim s1 as Double
Dim s2 as Double

s1 = microseconds

obj=GetIndexedObjectDescriptor("docu", nil , 1)
ae = NewAppleEvent("core","getd","sfri")
ae.ObjectSpecifierParam("----") = GetPropertyObjectDescriptor(obj, "conT")

If ae.send() then
s = ae.replyString
EditFIeld1.Text = s
end if

s2 = microseconds
editfield3.seltext = "AppleEvent: " + chr(9) + str(s2 - s1) + chr(10)

----------------------------------
結果発表(数字が大きい方が遅い)

Case1. ちょっと重めのページを表示させた状態

 AppleEvent: 210,350
 AppleScript: 309,295

 AppleScriptはAppleEventの1.4倍遅い

Case2. めちゃ軽いページ

 AppleEvent: 10,188
 AppleScript: 44,691

 AppleScriptはAppleEventの4.38倍遅い

(それぞれ30回の平均値)

やはりAppleEventを直接発行した方が速い。
重い処理ほど差が少なくなっている結果が出ている。
データの転送量が問題にならない処理では、もっと差が広がるだろう。

一応、試してみた。ウインドウの数を返す処理においては、AppleScriptはAppleEventの7倍遅かった。
コンディションによっては、10倍差が開くこともあった。

AppleEventで返り値のあるイベントを発行する場合、AppleEventの場合は返り値が型付きなので、例えばIntegerとして利用する場合は返り値が全部StringになってしまうAppleScript経由の取得より、キャストが必要無い分、さらにパフォーマンスの差が広がるものと思われる。

これに加えてAppleEvent直発行の方が安定性が高いのだから、いやー、もうこりゃ使い捨てじゃない処理はみんなAppleEventで実装って感じかね。AppleScriptは好きですが。

|

« [REALbasic]特定のアプリケーションプロセスの存在の有無をAppleEventで確認する in Mac OS X | Main | [REALbasic]続・SafariをREALbasicからAppleEventで操る »