Gaskostendifferenz zwischen uint[] und Mapping(uint => uint)

Wenn Sie beispielsweise eine große ganze Zahl auf eine ganze Zahl abbilden,

uint[] index;
index.length = 1000000;
index[600001] = 4;

ist es billiger zu verwenden

mapping(uint => uint) index;
index[600001] = 4;

? Ein Vorteil der Verwendung uint[]ist, dass es gelöscht werden kann, was in einer dApp, an der ich arbeite, nützlich ist.

Antworten (1)

Sie wären die gleichen, mit einer Modifikation.

Du würdest gehen

uint[1000000] index;
// index.length = 1000000; not needed

Der von Ihnen verwendete dynamische Index ist nur geringfügig teurer als das vorgeschlagene Array mit fester Länge, da er ein weiteres 32-Byte-Wort für die Arraylänge und den zusätzlichen Schritt zum Festlegen benötigt.

Beide Methoden verwenden einen 32-Byte-Schlüssel, um auf ein 32-Byte-Wort zu zeigen. Beide Methoden vermeiden unnötiges Schreiben, und die Werte in Indizes, in die nicht geschrieben wurde, sind standardmäßig 0.

Keine Methode profitiert davon, die Genauigkeit der Werte zu reduzieren, auf die gezeigt wird (z. B. auf uint8), da ein 32-Byte-Wort der kleinste Speicherplatz ist, den sie adressieren können.

Ich hoffe es hilft.

wird die Länge kontinuierlich anpassen, also müssen dynamische Arrays verwendet werden, denke ich
Danke, dass Sie meine Antwort akzeptiert haben. Seien Sie vorsichtig, wenn Ihre Anpassungen eine Neuorganisation der Liste beinhalten. Es gibt einige nicht offensichtliche Herausforderungen, mit denen man sich zufrieden geben muss.