ETS wird nicht als Garbage Collection erfasst, da sie außerhalb von Erlang-Prozessen in einem Heap gespeichert wird. Das heißt, wenn Sie etwas in Ets stecken, wird es hineinkopiert, und wenn Sie es herausnehmen, erhalten Sie eine Kopie in Ihrem Prozess. Viele ETS-Lookups können dann zu Überkonsum in Ihrem Prozess führen (dies ist jedoch nur für sehr hohe Threads relevant).
Das Prozesswörterbuch wird durch Garbage Collection gesammelt. Es wird im eigenen Heap des Prozesses gespeichert. Wenn Sie also darin nachschlagen, erhalten Sie einen Hinweis auf genau denselben Wert, den Sie eingeben. Die im Prozesswörterbuch gespeicherten Werte werden nicht komprimiert.
Beide Ansätze sind nicht rein, d. h. sie haben Nebenwirkungen. Ja, es ist schlecht, und ja, wir haben beide Alternativen.
Vorteile der ETS gegenüber dem Prozesswörterbuch sind:
ETS verhält sich mehr oder weniger so, als wäre die Tabelle in einem separaten Prozess und Anforderungen sind Nachrichten, die an diesen Prozess gesendet werden. Während es nicht mit Prozessen implementiert ist, werden die Eigenschaften von ETS so modelliert. Es ist tatsächlich möglich, ETS mit Prozessen zu implementieren.
Dies bedeutet, dass die Nebeneffekteigenschaften mit dem Rest von Erlang übereinstimmen.
Das Prozesswörterbuch ist wie nichts anderes in Erlang und das Hinzufügen war ein großer Fehler. Es gibt keinen Grund, das Prozesswörterbuch anstelle eines der lokalen Wörterbücher wie dict oder gb_trees zu verwenden.
Zweifellos hat ETS viel mehr Funktionalität und ist anspruchsvoller. Aber ...
Da die Aktualisierungs- / Suchoperationen des Prozesswörterbuchs nur die Referenzen und nicht die gesamten Daten verschieben (siehe die genaue Antwort von Christian), kann es viel schneller sein, besonders bei großen Datenstrukturen. Sobald ich einen Teil des Codes umstrukturiert habe, um die großen und häufig zugänglichen Datenstrukturen in proc zu halten. dict anstelle von ETS und wir hatten eine 30% ige Beschleunigung in diesem Teil des Codes.
In vielen Fällen wird auf die Daten nur in einem einzigen Prozess zugegriffen. In diesem Fall sehe ich keinen großen theoretischen Unterschied zwischen dem proc.dict und ETS. Beide dienen dazu, Nebenwirkungen im Gedächtnis zu halten. Außerdem können Sie auf den proc.dict eines anderen Prozesses wie
zugreifenprocess_info (whereis (net_kernel), Wörterbuch).
Tags und Links erlang