2017-01-25 6 views
0

iTunesライブラリディレクトリにあるトラックとAppleScriptを使用していないトラックを確認しようとしています。Applescript - ライブラリ内のすべてのiTunesトラックを繰り返し再生するとパフォーマンスが低下します

次のスクリプトは本当に遅いは、各トラックの約2秒(図書館には約8000のトラックがあります)取っている:

#!/usr/bin/osascript 
tell application "iTunes" 

     repeat with l in (location of every file track) 
       POSIX path of l does not start with "/Users/user/Music/iTunes/iTunes Media/" 
     end repeat 

end tell 

#!/usr/bin/osascript 
tell application "iTunes" 

     repeat with l in (location of every file track) 
       set fileName to (POSIX path of l) 
       if fileName does not start with "/Users/user/Music/iTunes/iTunes Media/" then 
         log fileName 
       end if 
     end repeat 

end tell 

は、以下が、同じ性能を試してみました

一方、iTunesはかなり反応しなくなります。

何かばかげている必要がありますが、何が分かりませんか。

これは、2015 27インチiMacのOS X El Capitanの下にあります。

助けてください。

乾杯

答えて

0

あなたは劇的にキーワードget

を使用してスクリプトをスピードアップすることができ
repeat with l in (get location of every file track) 

違いは次のとおりです。リストは各反復

  • に検索されたgetなし

    • getでリストは一度取り出されます
  • +0

    スポットに!ありがとう – user1905449

    0

    2つの問題:Appleイベントの多くを送信

    1. は高価です。 repeat with l in (location of every file track)は、トラックごとに別々のgetイベントを送信します(get location of file track 1get location of file track 2、...)。最初にすべての場所のリストを取得し、それを繰り返します。

    2. 厄介な実装のため、AppleScriptのリスト項目を取得するのにかかる時間は、リストの長さに比例して増加します。したがって、大きなリストを反復するときのパフォーマンスは、O(n)効率の代わりにO(n*n)になります。あなたは参照を介してリスト項目を参照する(例えば、スクリプトオブジェクトのプロパティにリストを貼り付け、次にそれを参照することによって)厄介なハッキングでO(n)に持っていくことができます。

    例:

    set iTunesFolder to POSIX path of (path to music folder) & "iTunes/iTunes Media/" 
    
    tell application "iTunes" 
        script 
         property fileLocations : location of every file track 
        end script 
    end tell 
    repeat with l in fileLocations of result 
        set fileName to (POSIX path of l) 
        if fileName does not start with iTunesFolder then log fileName 
    end repeat 
    
    関連する問題