このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

どちらが速い?Frontier VS AppleScript

発言者:maruo
( Date Wednesday, January 14, 1998 20:54:32 )


こんにちは
100個以上のファイル(サブフォルダ内含)のコメントを削除する
スクリプトを作っているのですが、
AppleScriptだととっても時間がかかってしまうようです。
以前、FrontierはAppleScpriptより数倍速いと聞いたのですが
実際の所は、いかがなものでしょうか?

田中求之 さんからのコメント
( Wednesday, January 14, 1998 21:19:11 )

コメントを削除する部分はどのように処理していますか? この部分を
Finder を使って削除を行っているのであれば、この部分の速度は Finder
の処理速度ですから、AppleScript だろうが Frontier だろうがたいして
変わらないはずです。

ファイルのリストアップを行う部分を Finder で行っているのであれば、
この部分は Frontier の walkfolder (だったかな?)というような
ディレクトリーを扱うコマンドを使うか、AppleScrit で osax を使う
ことで速度の向上がはかれます。

処理速度自体は PowerPC Native で Multi-thread で走る Frontier
の方が早いはずですが、他のアプリケーションとの連携などにおいては、
スクリプトの実行速度(処理速度)以外の要因が大きくなることに
気をつけてください。

野本夏俊 さんからのコメント
( Thursday, January 15, 1998 17:22:02 )

tellを使うことでこのような処理はめちゃめちゃ速くなります。
以下のようにします。

my PrePro()

on open
  my PrePro()
end open

on PrePro()
  tell application "Finder"
    try
      tell files of selection----------**1
        set comment to ""
      end tell
    on error
    end try
    try
      my MOSS(folders of selection)
    on error
    end try
  end tell
end PrePro

on MOSS(x)
  tell application "Finder"
    repeat with i in x
      try
        tell files of i----------**2
          set comment to ""
        end tell
      on error
      end try
      try
        my MOSS(folders of i)
      on error
      end try
    end repeat
  end tell
end MOSS

処理対象をファイルに限っていますがフォルダもなにも全部のコメントを削除するなら
**1、**2の行を各々以下のようにします。
tell selection-----------**1
tell items of i----------**2
ちなみに先日まで公開されて(?)いたこの会議室のアーカイブ(ファイル数1300以上)
をこれで処理するとたったの41秒で終ります。(OS7.6.1  AppleScriptJ1-1.1.1  UMAX Pulsar2250)
一気に処理するので1つのフォルダ内のファイルが多いとビーチボールがしばらく動きませんが
エラーではありません(エラーであることもあります.....)

フィルタやtellは効果絶大ですがケースバイケースでさまざまな工夫が必要になってくると思います。
皆さんもぜひ試して見て「こういうケースではこのようにすればいいぞ」などのノウハウを
公開していただけると嬉しいです。
くわしくはこちらにも↓書き込みました。

→  スクリプターズルーム

田中求之 さんからのコメント
( Thursday, January 15, 1998 18:43:22 )

>ちなみに先日まで公開されて(?)いたこの会議室のアーカイブ

まだ公開中です (^_^)

Hideaki Iimori さんからのコメント
( Thursday, January 15, 1998 19:40:48 )

遅い PowerMac8100/80ですが...550 fileに対して

上記 AppleScript       230秒
下記 Frontier Usertalk 8.5秒

local
    tBegin = clock.ticks()
    nFiles = 0
    f

fileLoop (f in "Internal2:QDGX",infinity)
    nFiles++
    if (file.getComment(f) != "")
        file.setComment(f,"")

msg(nFiles + " files " + (clock.ticks() - tBegin) / 60.0 + " sec")

Frontierの場合ほとんどの作業は内蔵関数で行えますので
この手の作業は AppleScriptの 10〜50倍程度高速です。

また Frontierでは folder中の fileを再帰的に全て Scanする操作は

    fileLoop (f in "folder to scan",infinity) {
        :
    }

と1行で書けるのも強みです。

野本夏俊 さんからのコメント
( Thursday, January 15, 1998 19:48:42 )

すごい!!
ぼくもFrontier勉強して見よう。

田中求之 さんからのコメント
( Thursday, January 15, 1998 20:25:45 )

>    if (file.getComment(f) != "")
>        file.setComment(f,"")

さすが Frontier、しっかりこういうコマンドも揃ってますねぇ。



maruo さんからのコメント
( Friday, January 16, 1998 02:46:21 )

田中先生、野本さん、そしてIimoriさんどうもありがとうございます。
自分なりにTanaka's OSAXを使ってがんばっていましたが
みなさんの処理速度にとうてい追いつけない状態でした。
dirListerを使うことで従来より3倍早く処理できるように
なりましたがそれでも1ファイル1秒くらいかかる状態でした。
しかしFrontierで行うととんでもなく早いですね。

一つ教えてください。
dirListerにwith asFSSを付けるのと付けないのでは
処理速度に違いが出るのでしょうか?

田中求之 さんからのコメント
( Friday, January 16, 1998 12:41:57 )

>dirListerにwith asFSSを付けるのと付けないのでは
>処理速度に違いが出るのでしょうか?

dirLister 自体の処理速度はほとんどかわりませんが、その後のファイル操作のことを
考えると、asFSS でリストを得ていたほうが楽です。

サブフォルダーも含めての処理でしたら、Tanaka's osax 1.2 を使うと

set myList to dirLister file "MacHD:Fldr:Fldr" with sub folders
tell application "Finder"
  repeat with thisF in myList
    set comment of thisF to ""
  end repeat
end tell

といった感じのスクリプトで済みますよ。

もっとも、コメントを消す部分にどうしても時間がかかりますが。

場合によっては、ここだけ Frontier を呼び出して利用するという手も
ありますね (^_^;

SHUICHI.T さんからのコメント
( Wednesday, April 15, 1998 13:21:29 )

このページから私の掲示板にリンクされていたとは...(笑)
(アクセスの記録より)

とりあえずこれだけ書いておきます(笑)。

→  SHUICHI.TによるAppleScript理論 (トップ)