Me pregunto si vale la pena invertir tiempo en la optimización de llamadas de cola para Google Apps Script.
Entonces, tengo entendido que Google Apps Script usa la versión ES2015 (ES6) de la especificación de JavaScript ( ref1 , ref2 ), ejecutándola en la implementación del tiempo de ejecución V8 .
Supuestamente, ES2015 admite la optimización de llamadas de cola (adecuada) de la especificación. Pero hay algunas indicaciones de que V8 en realidad no lo implementa:
Además, he aprendido que hay un matiz importante aquí:
La terminología de llamadas de seguimiento adecuadas (PTC) y optimización de llamadas de seguimiento (TCO) a menudo se combina. Aquí está la diferencia entre los dos:
- llamadas de cola adecuadas: las funciones llamadas en la posición de cola reutilizan el marco de pila actual, evitando la creación de marcos de pila adicionales que causan ineficiencia de espacio.
- optimización de llamada de cola: reescribe una función recursiva en una iterativa, generalmente llamando a goto.
PTC solo se ocupa de la manipulación de la pila, mientras que TCO reescribe una función recursiva como una función iterativa.
Entonces, dado esto...
Google Apps Script (GAS):
(Desarrollador V8 aquí.)
¿Admite Google Apps Script (GAS) llamadas de cola adecuadas?
No. V8 no admite PTC (ni STC); usted mismo ya se ha vinculado a la historia de fondo. Dado que GAS se basa en V8 para la ejecución de JS, tampoco puede admitirlos.
preguntándose si vale la pena invertir tiempo en hacer la optimización de llamadas de cola para un script. / ¿GAS admite la optimización de llamadas de cola hasta el punto en que vale la pena hacerlo, por rendimiento, de alguna manera?
No estoy seguro de lo que quiere decir: TCO es algo que potencialmente hace un compilador, no algo que usted hace.
Si quiere decir "mover llamadas a posiciones finales, para que el compilador pueda convertirlas en iteraciones": No, V8 no hace eso, por lo que no vale la pena. Si una llamada se produce en una posición de cola o no, no hace ninguna diferencia para el rendimiento. (Y no apostaría a que eso cambie pronto).
Si quiere decir "convertir manualmente la recursividad en iteración": puede valer la pena hacerlo para el código crítico para el rendimiento; si vale la pena hacerlo en su caso particular solo se puede responder probándolo y midiendo el efecto. (Como siempre, es muy probable que una pequeña prueba artificial, también conocida como "microbenchmark", produzca resultados engañosos que no se aplican a otras situaciones).
Esto no necesita ningún "soporte" de GAS o V8.