2017-01-25 1 views
0

J'essaie de vérifier quelles pistes se trouvent dans mon répertoire de la bibliothèque iTunes et lesquelles n'utilisent pas AppleScript.Applescript - Mauvaises performances itération de toutes les pistes iTunes dans la bibliothèque

Le script suivant est vraiment lent prendre environ 2 secondes pour chaque piste (il y a environ 8000 pistes dans la bibliothèque):

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

a également essayé ce qui suit, mais même performance:

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

Pendant ce temps, iTunes ne répond plus.

Doit faire quelque chose de stupide mais ne peut pas comprendre quoi.

Ceci est sous OS X El Capitan sur un 2015 iMac 27 '.

Toute aide appréciée.

Vive

Répondre

0

Vous pouvez accélérer considérablement le script en utilisant le mot-clé get

repeat with l in (get location of every file track) 

La différence est:

  • sans get la liste est récupérée à chaque itération
  • avec get la liste est récupérée une fois
+0

Spot on! Merci – user1905449

0

Deux problèmes:

  1. Envoi beaucoup d'événements Apple est cher. repeat with l in (location of every file track) envoie un événement get distinct pour chaque piste (get location of file track 1, get location of file track 2, ...). Obtenez d'abord la liste de tous les emplacements, puis parcourez-la.

  2. En raison de la mauvaise implémentation, le temps nécessaire pour obtenir un élément de liste AppleScript augmente linéairement avec la longueur de la liste; donc la performance lors de l'itération des grandes listes va dans le réservoir (O(n*n) au lieu de O(n) efficacité). Vous pouvez le ramener à O(n) avec un hack méchant, faisant référence à la liste des éléments par référence (par exemple en collant la liste dans une propriété d'objet de script, puis en faisant référence à cela).

Exemple:

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