2 votes

Ralentissement exponentiel d'Applescript

J'ai donc travaillé sur un simple AppleScript pour essayer d'aider à la gestion de mon courrier électronique dans Mail d'OS X, et j'ai l'impression qu'il fonctionne très bien avec un problème majeur ; la performance du script est horrible.

Maintenant, je sais qu'AppleScript n'est pas toujours le langage de script le plus rapide, mais je ne sais pas pourquoi les performances sont aussi mauvaises. Plus étrange encore, le temps nécessaire pour effectuer chaque opération dans une boucle semble augmenter avec le temps ! Par exemple, mon script devrait correspondre à environ 300 courriels (traités à partir d'une liste totalisant environ 500), après cinq minutes, il correspondra à environ 100 courriels, mais après vingt, il n'en aura correspondu qu'environ 125, ayant ralenti au point de prendre près d'une minute pour traiter chaque courriel, et continue à empirer jusqu'à ce que le script finisse par se terminer après environ trois heures.

Voici une version simplifiée du script :

set ignoreTheseMailboxes to { "Inbox", "Drafts", "Junk", "Sent", "Trash" }
set expiryDate to (current date) - (45 * days) as date

set myLogFile to open for access POSIX file "/Users/username/Desktop/test.log" with write permission

tell application "Mail"
    set theAccounts to every account
    repeat with eachAccount in theAccounts
        set theMailboxes to mailboxes in eachAccount
        write name of eachAccount & return to myLogFile

        repeat with eachMailbox in theMailboxes
            if (ignoreTheseMailboxes does not contain (name of eachMailbox) then
                write " " & name of eachMailbox & return to myLogFile

                set theMessages to messages in eachMailbox
                repeat with eachMessage in theMessages
                    if date received of eachMessage <= expiryDate then
                        write "     " & subject of eachMessage & return to myLogFile
                    end if
                end repeat
            end if
        end repeat
    end repeat
end tell

close myLogFile

Vous devrez pardonner les éventuelles fautes de frappe dues au fait que j'ai réduit les choses, mais ce qui précède est le comportement de base du script, et présente le même problème lorsqu'il est exécuté sur les mêmes comptes de messagerie et messages.

Ce que j'aimerais savoir, c'est la raison pour laquelle un script comme celui-ci connaîtrait des ralentissements croissants, et y a-t-il un moyen de l'optimiser pour éviter ce genre de problèmes ?

Il est juste regrettable que nous ne puissions pas voir les dossiers intelligents dans Mail, car cela pourrait réduire considérablement le nombre de messages devant être recherchés (et éviter la nécessité de les tester).

[modifier] En outre, je dois noter que, pendant le fonctionnement, le processus exécutant le script grimpera rapidement à 100% d'utilisation du CPU, de sorte qu'AppleScript fait certainement quelque chose mais je ne sais pas quoi !

1voto

Haravikk Points 1128

Il semble que le problème ne soit pas avec AppleScript, mais avec script Editor, après l'avoir confirmé par un aller-retour avec un ingénieur d'Apple. Je ne suis toujours pas convaincu de la raison pour laquelle cela devrait être le cas, mais le script fonctionne beaucoup mieux lorsqu'il est exécuté via osascript surtout après l'avoir remanié pour qu'il utilise un fichier whose lors de la récupération des messages, plutôt que d'itérer sur eux avec une instruction if condition.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X