Applescript - 糟糕的性能迭代库中的所有iTunes曲目

时间:2017-01-25 20:12:09

标签: performance applescript itunes osx-elcapitan

我正在尝试检查哪些曲目位于我的iTunes资料库目录中,哪些曲目未使用AppleScript。

以下脚本实际上每个曲目大约需要2秒钟(图书馆中大约有8000个曲目):

#!/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

还尝试了以下内容,但性能相同:

#!/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

同时iTunes变得反应迟钝。

必须做些傻事但却无法弄清楚是什么。

这是在OS 27 El Capitan的2015年27'iMac。

任何帮助表示感谢。

干杯

2 个答案:

答案 0 :(得分:0)

您可以使用关键字get

显着加快脚本速度
repeat with l in (get location of every file track)

区别在于:

  • 没有get在每次迭代中检索列表
  • get列表将被检索一次

答案 1 :(得分:0)

两个问题:

  1. 发送大量Apple活动费用昂贵。 repeat with l in (location of every file track)为每首曲目(getget location of file track 1,...)发送单独的get location of file track 2个事件。首先获取所有位置的列表,然后迭代它。

  2. 由于实施蹩脚,获取AppleScript列表项所需的时间随着列表的长度线性增加;因此,当迭代大型列表时,性能会进入槽中(O(n*n)而不是O(n)效率)。您可以使用讨厌的黑客将其降低到O(n),通过引用引用列表项(例如,将列表粘贴在脚本对象属性中,然后引用它)。

  3. 示例:

    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