3

私は最近、グローバル ショートカットを使用して現在フォーカスされているウィンドウ内を移動するWindowTilerというユーティリティ プログラムを作成しました。AppleScript を使用してウィンドウ内を移動し、次のスクリプトを使用して、フォーカスされたウィンドウの境界を取得します。

tell application "System Events"
  set appName to the first process whose frontmost is true
  set appWindow to the value of attribute "AXFocusedWindow" of appName
  set {w, h} to the size of appWindow
  set {x, y} to the position of appWindow
  set appBounds to {x, y, x + w, y + h}
end tell
{bounds:appBounds}

時間が経つにつれて、しばらく使用しないとアプリの反応が遅くなることに気付きました。時間のパフォーマンスを集中的に測定した結果、表示されている AppleScript の2 行目が応答の遅さの原因であることがわかりました。スクリプトの実行に 1 秒かかることもありました (私の知る限り、SSD では、HDD ではさらに悪化します)。

AppleScript が最前部のプロセスを検索するだけで、なぜこれほど長い時間が必要なのかはわかりません。これは、Process Manager への唯一の要求である必要があります。なぜそんなに遅いのか、スクリプトを高速化する方法を教えてください。

PS: アプリ (「アーカイブ」) を作成するときに、AppleScript をプリコンパイルするように Xcode を構成しました。コンパイルされたスクリプトは読み取り専用です。

4

2 に答える 2

0

Carbon ベースのイベント ホットキーを受け取る際に、この種の遅延は見たことがありません。ホットキー コールバックがいつ呼び出されるかを確認するために、コードにログを追加しましたか? それには実際に数秒かかりますか、それとも処理に数秒かかるのでしょうか?

これをうまく行う方法の例については、 DDHotKeyを参照してください (または、 Dave のコードを使用して自分のコードを置き換えたい場合もあります)。

編集

プログラムをしばらく実行した後に問題が発生した場合は、Instruments を介して実行することもできます。大量のメモリまたはスレッドをリークしていないことを確認してください。それはあなたが説明している症状を与える可能性があります。

EDIT2

オンデマンドでロードするのではなく、スクリプトをロードして ivar または static に保持しないのはなぜですか? コンパイルしたとしても、ディスクから読み取って解析し、データ構造を構築する必要があります。(また、この質問は本題から逸れました。あなたはそれを閉じて、Applescript のパフォーマンスについての新しい質問を始めるべきです。さもなければ、後で答えを探している人々を台無しにしてしまいます。)

于 2011-07-31T08:33:18.577 に答える