Das sollte schnell gehen: Ich habe mich oft gefragt, ob es einen Effizienzunterschied zwischen den LISP-Sonderfunktionen let
und let*
gibt? Sind sie zum Beispiel äquivalent, wenn nur eine Variable erstellt wird?lassen vs * in LISP lassen - gibt es einen Unterschied in der Effizienz?
Antwort
Es sollte keinen Leistungsunterschied geben. Der einzige Unterschied zwischen ihnen ist der Umfang der Variablen, der zur Kompilierzeit behandelt wird. Wenn es nur eine Variable gibt, gibt es absolut keinen Unterschied.
Wie Barmar betonte, sollte es bei "produktionsfertigen" Lisps keinen Leistungsunterschied geben.
Für CLISP, die beide diese produzieren die gleiche (Bytecode) Montage:
(defun foo (x) (let ((a x) (b (* x 2))) (+ a b)))
(defun bar (x) (let* ((a x) (b (* x 2))) (+ a b)))
Obwohl für Nicht-optimierende, einfache Dolmetscher (oder Compiler auch) dort sehr gut einen Unterschied sein könnte, z.B.
;; Possible macro expansion for foo's body
(funcall #'(lambda (a b) (+ a b)) x (* x 2))
;; Possible macro expansion for bar's body
(funcall #'(lambda (a) (funcall #'(lambda (b) (+ a b)) (* x 2))) x)
mit mehreren lambdas, sowie die (vermeidbare) Schließung: wahrscheinlich effizienter jeder mit einem einzelnen Parameter implementiert wird als mehrere Lambdas weil let*
und let
könnte so einfach Makros und ein einziges Lambda mit mehreren Parametern ist über a
könnte die zweite Erweiterung weniger "effizient" machen.
Wenn nur eine Bindung verwendet wird, sollte es auch dann keinen Unterschied geben.
Aber wenn Sie eine Implementierung verwenden, die let*
(oder let
) nicht optimiert, dann ist es wahrscheinlich kein Problem, die Leistung überhaupt zu diskutieren.
- 1. Clojure lassen vs Common Lisp lassen
- 2. Lisp Auswertung von lassen Aussagen
- 3. Lassen Sie vs vs Leistung
- 4. Gibt es eine Möglichkeit, einen Prozess "aufwärmen" zu lassen?
- 5. Gibt es in Jasmine irgendwelche Unterschiede zwischen beforeAll() und lassen?
- 6. Lisp: Gibt es einen Unterschied zwischen 'Null und Null?
- 7. lassen oder struct vs enum
- 8. lassen Sie in cond
- 9. CATextLayer NSBackGroundColorAttributeName gibt es eine Möglichkeit, es funktioniert zu lassen?
- 10. const vs Lassen Sie beim Aufruf erfordern
- 11. rspec modell spec lassen vs fabrik
- 12. gibt es einen Unterschied in der Laufzeit der folgenden:
- 13. Gibt es einen Unterschied in der Reihenfolge der Gleichheit?
- 14. Umgebung lassen Argumente in Swift
- 15. Einen BackgroundWorker kontinuierlich laufen lassen
- 16. Dateihistorie: in der Quelle oder lassen SCM es behandeln?
- 17. lassen Sie var oder var zu lassen
- 18. Gibt es einen Unterschied zwischen '=' und In?
- 19. Unterschied zwischen definieren und lassen w.r.t. syntax-rules keywords
- 20. Iterieren über eine Sammlung in Swift: var vs. lassen
- 21. Unterschied zwischen lassen, Spaß und Funktion in F #
- 22. Gibt es einen Unterschied zwischen -x vs x * -1.0f?
- 23. Gibt es einen Unterschied zwischen return myVar vs. return (myVar)?
- 24. PathGetArgs/PathRemoveArgs vs. CommandLineToArgvW - gibt es einen Unterschied?
- 25. Gibt es eine Möglichkeit, die URL der Website in der ONET.XML-Datei erstellen zu lassen?
- 26. Gibt es eine Möglichkeit, Asio ohne Boost arbeiten zu lassen?
- 27. lassen vs var Leistung in NodeJS und Chrom
- 28. (Liste ...) vs '(...) in Lisp
- 29. Lassen Sie vs Ausdruck gegen Doppelklammer Arithmetik in Shell
- 30. Welchen Vorteil hat es, eine Variable nicht initialisiert zu lassen?
Ich kann keine Dokumentation in der Hyperspec sehen, die die redundante Nutzung von 'let *' zu 'let' erfordert. Selbst wenn alle aktuellen Lisps identischen kompilierten Code bilden, wäre es immer noch ein De-facto-Standard, genau wie Sie wirklich kein Tail Call annehmen können Optimierung. – Sylwester