Wie haben Sie vorab die Größe eines Arrays in Lua?
Ich habe ein Lua-Programm, das scheint langsamer als es sein sollte. Ich vermute, das Problem ist, dass ich bin das hinzufügen von Werten zu einem assoziativen array und die Tabelle hat, um neuen Speicher jedes mal.
Es schien eine Tabelle.setzen-Funktion, aber es nicht unter Lua 5.1.3:
stdin:1: 'setn' is obsolete
stack traceback:
[C]: in function 'setn'
stdin:1: in main chunk
[C]: ?
Entnehme ich aus der Google Suche, die ich getan habe, dass diese Funktion war abgeschrieben in Lua 5.1, aber ich kann nicht finden, was (wenn überhaupt) ersetzt.
Wissen Sie, wie Sie vorab die Größe einer Tabelle in Lua?
Alternativ, gibt es eine andere Möglichkeit zu vermeiden, Speicherzuweisung, wenn Sie ein Objekt zu einer Tabelle?
- Ich lese das zum Spaß, den anderen Tag, aber wenn Sie interessiert sind in lua Leistung, sollten Sie sich dieses Papier auf die Umsetzung des lua geht es über etliche interne Daten-Strukturen. lua.org/doc/jucs05.pdf
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lassen Sie mich konzentrieren sich mehr auf Ihre Frage:
Tabellen in Lua sind assoziativ, aber mit Ihnen in eine array-form (1..N) optimiert ist. Sie haben Doppel-Gesichter, intern.
Also.. Wenn man in der Tat hinzufügen, Werte assoziativ, Folgen Sie den oben genannten Regeln.
Wenn Sie mit Indizes 1..N, Sie können erzwingen, dass ein one-time-Größe justieren durch einstellen t[100000]= etwas. Sollte dies funktionieren, bis das limit von optimierten array-Größe angegeben, die innerhalb von Lua-Quellen (2^26 = 67108864). Danach, alles ist assoziativ.
p.s. Die alten 'setzen' - Methode behandelt das array nur teilweise, so dass es keine Verwendung für assoziative Nutzung (Ignoriere solche Antworten).
p.p.s. Haben Sie studiert Allgemeine Tipps für die Aufbewahrung Lua Leistung hoch? d.h. wissen zur Erstellung der Tabelle und ziemlich Wiederverwendung einer Tabelle als eine neue zu erstellen, verwenden Sie "lokaler print=print', und solche zu vermeiden, die Globale zugreift.
t = {}; t[100000] = true
Ergebnis wäre eine leere array-Teil und einen hash-Teil mit einem element.Dann in Lua,
Als quick hack diese Ausführung zu erhalten, können Sie fügen Sie das C zu
lua.c
.Ich glaube nicht, können Sie - es ist kein array, es ist ein assoziatives array, wie ein perl-hash oder ein awk-array.
http://www.lua.org/manual/5.1/manual.html#2.5.5
Ich glaube nicht, können Sie preset-seine Größe sinnvoll aus der Lua-Seite.
Wenn Sie die Zuweisung der array auf der C-Seite, obwohl die
kann das sein, was Sie brauchen.
Gibt es noch eine interne luaL_setn und Sie kompilieren können, Lua, so dass
es ausgesetzt ist als Tisch.setzen. Aber es sieht so aus, dass es nicht helfen wird
da der code scheint nicht zu tun, pre-Erweiterung.
(Auch das setzen von so kommentiert über das setzen ist in Bezug auf die array-Teil
einer Lua-Tabelle, und Sie sagte, dass Ihr die Tabelle als ein assoziatives
array)
Der gute Teil ist, dass selbst wenn Sie fügen Sie die Elemente ein durch einen Lua nicht
steigern Sie das array auf diese Weise. Stattdessen verwendet es eine vernünftige Strategie. Sie noch
Holen Sie sich mehrere Zuordnungen für eine größere array-aber die Leistung ist besser als
immer eine neue Zuteilung jedes mal.
Obwohl dies nicht die Antwort auf Ihre wichtigste Frage, die es beantwortet auch Ihre zweite Frage:
Wenn Ihr Betrieb Lua in einer benutzerdefinierten Anwendung, wie ich denke, da Ihr C-Codierung, ich schlage vor, Sie ersetzen Sie die Zuweisung mit Loki kleinen Wert-Zuweisung, es reduziert meine Speicherzuordnungen 100+ fache. Dies verbessert die performance durch die Vermeidung von Roundtrips zum Kernel, und machte mich viel glücklicher Programmierer 🙂
Sowieso ich habe versucht, andere allocators, aber Sie waren mehr Allgemeine, und mit Garantie ist, die nicht profitieren Lua-Anwendungen (wie etwa thread-Sicherheit, und großes Objekt, Zuordnung, etc...), auch das schreiben Ihrer eigenen klein-Objekt-Zuweisung kann eine gute Woche für die Programmierung und das debugging zu bekommen genau das richtige, und nach der Suche für eine Lösung Loki Zuweisung wasthe einfachste und Schnellste fand ich für dieses problem.
Wenn erklären Sie Ihren Tisch im code mit einer bestimmten Anzahl von Elementen, etwa so:
dann Lua erstellen der Tabelle mit Arbeitsspeicher bereits zugewiesen ist, die für mindestens
n
Elemente.Jedoch, Lua verwendet die 2x inkrementelle Speicher Zuweisung Technik, so dass das hinzufügen eines Elements zu einer Tabelle sollten nur selten erzwingen eine Umverteilung.