2 votos

Ralentización exponencial de Applescript

Así que he estado trabajando en un simple AppleScript para tratar de ayudar con la gestión de mi correo electrónico en Mail de OS X, y lo tengo aparentemente funcionando muy bien con un problema importante; el rendimiento de la script es horrible.

Ahora, sé que AppleScript no es siempre el lenguaje de scripting más rápido, pero no estoy seguro de por qué el rendimiento es tan malo como es. Aún más extraño, ¡el tiempo necesario para completar cada operación en un bucle parece aumentar con el tiempo! Por ejemplo, mi script debería coincidir con unos 300 correos electrónicos (procesados a partir de una lista que suma unos 500), después de cinco minutos coincidirá con unos 100 correos, pero después de veinte sólo habrá coincidido con unos 125, habiéndose ralentizado hasta el punto de que tarda casi un minuto en procesar cada correo, y sigue empeorando hasta que el script termina finalmente después de unas tres horas.

Aquí tienes una versión simplificada del 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

Tendrás que perdonar cualquier error tipográfico que haya podido cometer, pero lo anterior es el comportamiento básico del script, y muestra el mismo problema cuando se ejecuta en las mismas cuentas de correo y mensajes.

Lo que me gustaría saber es, ¿cuál es la razón por la que un script como este experimentaría ralentizaciones crecientes, y hay alguna forma de optimizarlo para evitar este tipo de problemas?

Es una pena que no podamos ver carpetas inteligentes en Mail, ya que podría reducir significativamente el número de mensajes que hay que buscar (y evitar la necesidad de probarlos).

[editar] Además, debo señalar que durante la operación del proceso que ejecuta el script se arrastrará rápidamente hasta el 100% de uso de la CPU, por lo que AppleScript está definitivamente haciendo algo Pero no sé qué.

1voto

Haravikk Puntos 332

Parece que el problema no es con AppleScript, sino con script Editor, después de confirmarlo con un ida y vuelta con un ingeniero de Apple. Todavía no estoy convencido de por qué este debe ser el caso, pero el script se ejecuta mucho mejor cuando se ejecuta a través de osascript sobre todo después de refactorizarlo para utilizar un whose al obtener mensajes, en lugar de iterar sobre ellos con una sentencia if estado.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X