Database Events (7)

Database Events (6) の続きです。前回、最初の方でスクリプトメニューから実行すると処理速度は速い、と書きました。これは、Database Events に限った話ではなく、どのアプリケーションのスクリプトでも速くなります(Carbon、Cocoa 両方ともかどうかまでは調べていませんが)。

ところで...System Events の用語説明には表示されない Hidden Suite という Suite をご存知でしょうか?

この Suite では、9 個の命令が定義されています。cancel、confirm、decrement、do action、do script、increment、key down、key up、pick の 9 個です。これらの使い方を詳らかにするのが目的ではないので端折りますが、多くは UI Element の操作を行うための命令です。do action と do script は(System Events 1.0 の頃から使っている人は知っていると思いますが)、フォルダアクションを実行する命令と OSA Script を実行する命令です。今回、取り上げるのは do script 命令。この命令は、run script 命令と同じように引数で指定したスクリプトファイルを実行するための命令です。

おそらく...スクリプトメニューは、この命令を使っているのではないかと思います(ただの推測なのですが)。スクリプトメニューは、Cocoa/Objective-C なのでしょうが、その中で NSAppleScript を使って System Events の do script を実行しているのではないかと思います。以下のスクリプトを実行すると System Events が返ってくることから考えてみても。

Script Editor で開く

on run
    tell application "System Events"
        set f to name of processes whose frontmost of it is true
    end tell

    display dialog (f as text)
end run

スクリプトメニューは、SystemUIServer が動かしているのですが。

つまり、スクリプトを do script 命令で動かせば処理速度は速くなる、ということが言えると思います。では、実験。

まず、実験した環境を。iMac G5(2 GHz Power PC G5)でメモリは 1 GB。HDD は、400 GB。OS は、最新。Mac OS X 10.4.8 です。AppleScript 1.10.7。Script Editor 2.1.1。

以下のスクリプトをコンパイル済みスクリプトとして保存します。

Script Editor で開く

on run
    set ex to ".dbev"
    set theName to "tmp"
    set dir to path to desktop as Unicode text
    set dbFile to dir & theName & ex

    tell application "Database Events"
        if exists database theName then
            set db to database theName
        else
            if exists database (POSIX path of dbFile) then
                set db to database (POSIX path of dbFile)
            else
                set db to make new database with properties {name:theName, location:dir}
                save db
            end if
        end if

        set cd to current date
        tell db
            repeat with i from 1 to 500
                make new record with properties {name:""}
            end repeat
            save
        end tell
        set num to (current date) - cd

        delete db
        quit
    end tell

    return num
end run

単純にデータベースに record を 500 個新規作成するだけのものです。これを Script Editor 上で実行すると、約 27 秒。次に、スクリプトメニューから実行します。このとき、約 10 秒。全く処理速度が違います。そして、do script 命令。

データベースに record を追加するスクリプトを do script 命令で 50 回呼び出して平均値をとってみました(データベスは、毎回削除して新規に作りながら)。結果、9.52 秒。スクリプトメニューの結果と同じです。

ついでにと思い、run script 命令も試してみます。これも 50 回呼び出して平均値をとってみました。結果は、6.12 秒。do script 命令に比べ、約 3 秒近く早くなっています。驚くべき事実。何がお前をそこまで変えてしまったんだ、と問わずにはいられません。

というか、AppleScript の処理速度って上がっていますよね。ただ、Script Editor で開発、デバックを行っていると気づかないし、むしろ、遅い。AppleScript Studio でアプリケーションにしたら速度が上がるなと思っていましたが、ようは Script Editor が悪かったんですね。これって既知のこと?うわっ...時代に取り残されていたよ。

これなら、積極的に Database Events を使ってみようという気になるもの。また、Script Editor でスクリプトを作っていて処理速度が遅いな、と思ったとき一度スクリプトメニューから実行してみるのもいいかも。ただ、デバックがより面倒になるよな...。

0 件のコメント :

コメントを投稿