This would require a bit of extra work to convert my code, but the question is: is it worth it? The code would probably consume less memory, but what are the other advantages? Would it be faster? More readable (probably not)? Should I overall do it?
L'ultima cosa che considererei l'utilizzo delle coroutine è l'efficienza computazionale. Hanno un sacco di spese generali in termini di acquisizione dello stato dello stack di chiamate e così via e ramificano istruzioni per riprendere da dove si era interrotto (è quasi sempre un superset dei dati e della memoria è necessario fare ciò che è necessario fare se si programmato assente coroutine che memorizzano / sversano tutto quello stato).
Per me sono tutti di produttività. A volte è un po 'dispendioso in termini di tempo implementare anche un iteratore in avanti a una complessa struttura di dati del grafico, mentre l'implementazione della coroutine ricorsiva potrebbe essere molto più semplice rendendo la struttura dei dati davvero facile da usare per i client. È quando raggiungo le coroutine. Quando sono preoccupato dell'efficienza computazionale, non raggiungo nemmeno Lua, nemmeno LuaJIT.
This would require a bit of extra work to convert my code, but the question is: is it worth it?
Non prenderei nemmeno in considerazione la possibilità di riscrivere codice funzionante e ben collaudato per usare le coroutine se va bene senza di esse. Ecco i dettagli di implementazione, e non mi interessa di quelli. Se verifica e funziona correttamente e si comporta in modo bello, allora non mi interessa se sta usando le coroutine o qualsiasi altra cosa, e non penso che nessuno dovrebbe farlo fino a quando non dovrebbero. Se non funziona bene e stai lottando per ottenere qualcosa di buono mentre inciampi sui bug di sinistra e di destra, perché è così difficile ottenere queste coroutine in modo corretto, allora forse usare le coroutine nell'implementazione potrebbe salvare il giorno, o no, ma non sono una caratteristica magica del genere che dovrebbe tentarti a riscrivere ciò che già funziona senza di loro.
The code would probably consume less memory [...]
Perché mai ci pensi? Coroutine richiedono quasi sempre un superset di memoria / dati alle alternative, poiché devono essere in grado di riprendere l'esecuzione da qualsiasi punto arbitrario nello stack di chiamate. I programmatori umani di solito hanno più informazioni su esattamente quali dati / memoria hanno bisogno in quei contesti, e non è che le coroutine siano ottimizzate dalla magia per quanto riguarda gli ottimizzatori. Quindi di solito è il contrario; le coroutine prendono più memoria, non meno, e sono generalmente meno efficienti, non di più, rispetto alle alternative. Ma possono essere un enorme aumento della produttività per gli sviluppatori in alcuni scenari per aiutarli a implementare il loro codice in modo più semplice e corretto.