gDown Leistung

Gleicher Graph, gleiche Abfragen und gleiche Maschine für jede Datenbank der Tabelle oben: Die Zahlen unten sind der Median über die Läufe der Tabelle zum Aufbau, gemessen auf arm64.

Dauerhaftigkeit der gemessenen Datenbanken

Für diese Werte zur Leistung werden alle Datenbanken im persistenten Modus gemessen (Daten auf die Platte geschrieben, beim Neustart wieder eingespielt).

Gemessene Datenbanken

DatenbankGemessene VersionEdition oder LizenzProtokollMessungen
gDownmain @ 087a1a5, 2026-10-16JVM build, benchmark settingsBoltLasten
Neo4j5.26.31 communityCommunity (GPLv3)BoltLasten
Memgraph3.13.1Community (BSL 1.1)BoltLasten
FalkorDB0.0.1 on Redis 8.10.2SSPL 1.0RESPLasten
ArcadeDB26.10.1Apache 2.0BoltLasten
TuGraph4.5.1Community (Apache 2.0)BoltLasten
Apache AGE1.8.0 on PostgreSQL 18.6 (Debian 18.6-1.pgdg13+2)Apache 2.0 (PostgreSQL extension)JDBCLasten

So läuft der Benchmark

EigenschaftWert
Architekturarm64
MaschineApple M4 Max, 16 logical CPUs, 64 GB RAM; Docker 29.8.2
Grenzen der Container4 CPUs, 8 GB Speicher je Container
Graph der Lasten100,000 Knoten, 1,000,000 Beziehungen, mit festem Seed erzeugt
Läufe3 vollständige Läufe; jede Zahl ist der Median der Läufe
ClientsEin Java-Client auf dem Host; je nach Last 1, 4, 8 gleichzeitige Clients
ProtokollDer Transport jeder Datenbank (Tabelle oben): Bolt auf beiden Seiten für gDown und Neo4j; vor jeder Last eine Aufwärmrunde, nicht gezählt
Daten2026-10-07 – 2026-10-15

Start, Speicher, CPU und Größe

Ohne Index

LastgDownNeo4jMemgraphFalkorDBArcadeDBTuGraphApache AGE
Start bis zur ersten Antwort0.64.21.40.82.51.51.9
CPU im Mittel (100 % = ein Kern)1661791999794101109
CPU-Spitze401384408155212408244
Speicherspitze5194,8145384366,425374477
Daten auf der Platte1768363893983165529

Mit Indizes auf den Kennungen

LastgDownNeo4jMemgraphFalkorDBArcadeDBTuGraphApache AGE
Start bis zur ersten Antwort0.64.21.40.82.51.51.9
CPU im Mittel (100 % = ein Kern)1411801939794101109
CPU-Spitze397380412154212408244
Speicherspitze9784,8135054296,425374477
Daten auf der Platte1828373893983165529

Start: von docker run bis zur ersten Antwort auf RETURN 1, Median mehrerer Versuche, einmal gemessen und in beiden Konfigurationen gezeigt; die anderen Zeilen decken den ganzen Lauf der Lasten ab. CPU und Platte werden nicht gereiht: Eine Datenbank, die nichts Dauerhaftes schreibt, hat 0 MB auf der Platte.

Komplexe Lesezugriffe: mediane Latenz — LDBC SNB Interactive

Die 29 Abfragen der Interactive-Last des LDBC Social Network Benchmark (14 komplexe Lesezugriffe, 7 kurze, 8 Aktualisierungen; Apache 2.0, unverändert) laufen alle auf einem erzeugten Graphen mit dem SNB-Schema.

  • 29 / 29 Abfragen ausgeführt: 14 komplexe Lesezugriffe, 7 kurze, 8 Aktualisierungen
  • 3 / 3 Mitglieder eines 3-Knoten-Clusters liefern bei den 21 Lesezugriffen dieselbe Zeilenzahl
  • 18 ms Median eines Schreibzugriffs, während der Leader 1.365 bestätigt (3.000 Personen)
  • 0 ms Median eines Lesezugriffs auf einem Follower während dieser Schreibzugriffe (95. Perzentil: 30 ms)

Alle Datenbanken, 3,000 Personen

LastgDownNeo4jMemgraphFalkorDBArcadeDBTuGraphApache AGE
complex-12.37.5––12.3––
complex-21.22.43.8209.03.3––
complex-39.010.38.9–19.5––
complex-40.92.21.10.62.5–126.1
complex-54.710.14.92.516169.2––
complex-64.15.32.6–10.4––
complex-70.82.11.4––––
complex-80.61.51.60.61.7––
complex-96.05.816.9–16.6––
complex-101.14.8–––––
complex-110.92.41.40.62.5––
complex-121.72.64.4–3.1––
complex-130.91.6––1.2––
complex-140.82.2––1861.0––

Ein Strich: Die Datenbank lehnt die Abfrage ab, überschreitet ihr Zeitlimit oder liefert eine andere Zeilenzahl als Neo4j (ihre Zeit sagte dann nichts aus). Fall für Fall:

Alle Datenbanken, 30,000 Personen

  • complex-1 : gDown 12.9 ms, Neo4j 51.5 ms
  • complex-2 : gDown 2.8 ms, Neo4j 2 ms
  • complex-3 : gDown 15.1 ms, Neo4j 13.3 ms
  • complex-4 : gDown 1.6 ms, Neo4j 1.7 ms
  • complex-5 : gDown 19.5 ms, Neo4j 16.9 ms
  • complex-6 : gDown 6.7 ms, Neo4j 7 ms
  • complex-7 : gDown 1.4 ms, Neo4j 1.4 ms
  • complex-8 : gDown 0.8 ms, Neo4j 1 ms
  • complex-9 : gDown 15.1 ms, Neo4j 8.5 ms
  • complex-10 : gDown 4.4 ms, Neo4j 4.2 ms
  • complex-11 : gDown 1.9 ms, Neo4j 1.8 ms
  • complex-12 : gDown 2 ms, Neo4j 2.4 ms
  • complex-13 : gDown 0.9 ms, Neo4j 1 ms
  • complex-14 : gDown 4 ms, Neo4j 3.3 ms

Median über 5 Personen nach einer Aufwärmrunde, ein Durchlauf je Datenbank, in Containern mit den Grenzen der Tabelle zum Aufbau; jede Datenbank wird über ihren eigenen Transport angesprochen (Bolt auf beiden Seiten für gDown und Neo4j: der Round-Trip zählt auf beiden Seiten). „< 1 ms“: der Median rundet auf null Millisekunden. Kurze Lesevorgänge: Median unter einer Millisekunde für gDown (0,5 bis 0,7 ms) gegenüber 0,7 bis 1 ms für Neo4j, gleiches Protokoll auf beiden Seiten.

Bei 3.000 Personen (90.000 Knoten und 470.000 Beziehungen, per Raft in 16 s geladen) bleiben die Mediane unter 60 ms. Zwei Optimierungen, die dieser Test gefunden hat: complex-1 sank von 0,6 s auf 34 ms, complex-14 von 2 s auf 8 ms.

Keine offiziellen LDBC-Ergebnisse: Diese Zahlen sind von der Last LDBC SNB Interactive abgeleitet und wurden nicht vom LDBC (Linked Data Benchmark Council) auditiert. Die Daten erzeugt der Test, nicht der LDBC-Datagen: Die Zeiten sind mit veröffentlichten LDBC-Ergebnissen nicht vergleichbar. Ein Lauf pro Konfiguration. Der Test fand außerdem zwei Fehler, die behoben sind.

Quelle: gluonify-gdown, README und Berichte von LdbcSnbTest und LdbcClusterTest.

Die Cypher-Abdeckung (das openCypher-TCK auf jeder Datenbank) steht auf der Vergleichsseite.

Latenz und Durchsatz, Last für Last

Gleicher Graph, gleiche Abfragen und gleiche Maschine für jede Datenbank der Tabelle oben: Die Zahlen unten sind der Median über die Läufe der Tabelle zum Aufbau, gemessen auf arm64.

Die Latenz ist der Median (p50) in Millisekunden, kleiner ist besser; die Lasten mit mehreren Clients sind in Anfragen pro Sekunde, größer ist besser. Der beste Wert jeder Zeile steht fett. Über die Standardwerte jedes Images hinaus ist nichts abgestimmt; gDown läuft auf der JVM mit 6 GB Heap und 2 GB Seitencache, Neo4j mit 4 GB Heap und 2 GB Seitencache. Jeder Lauf startet in einem frischen Container, lädt den Graphen in UNWIND-Stapeln, prüft, dass die Datenbanken bei den Ergebnissen übereinstimmen, und misst dann.

Ohne Index

LastgDownNeo4jMemgraphFalkorDBArcadeDBTuGraphApache AGE
Lesen nach Kennung0.290.740.560.180.860.490.24
Lesen nach Eigenschaft11.77.937.052.390.420.470.25
Bereich über eine Eigenschaft (100 Werte)17.410.811.63.1123.776.70.26
Zählen eines Labels0.380.744.030.190.4697.99.37
1 Sprung0.280.520.400.190.400.510.27
2 verschiedene Sprünge0.350.560.410.210.450.610.73
3 verschiedene Sprünge0.881.170.710.341.071.375.61
Gruppieren + Top 103.9410.932.614.98.7414562.5
Filter + Aggregat24.411.79.943.475.5178.324.0
Zählen eines Musters (alle KNOWS zwischen Personen)21.421959.931.410182745.9
Heiße Lesevorgänge + eine vollständige Traversierung pro 1000.320.570.410.190.410.530.31
Erste 10 Zeilen eines großen Ergebnisses0.330.590.460.200.600.560.21
Schreiben: 1 Knoten pro Anfrage0.470.570.570.350.560.490.26
Schreiben während einer langen Traversierung0.660.540.7135.00.800.600.28
8 Clients: 1 Sprung16,2398,4379,81128,45810,5254,24916,372
4 Clients: Schreiben6,8015,2233,2604,6523,3643,6759,280

ArcadeDB (indiziert) wird immer mit Index gemessen: Seine internen Kennungen schließen die Suche über id() der anderen Spalten aus. Seine Spalte steht hier, damit nichts fehlt, aber seine Verhältnisse ohne Index vergleichen einen Index mit einem Scan: Für den fairen Vergleich siehe die Tabelle mit Indizes.

Mit Indizes auf den Kennungen

LastgDownNeo4jMemgraphFalkorDBArcadeDBTuGraphApache AGE
Lesen nach Kennung0.300.730.500.180.860.490.24
Lesen nach Eigenschaft0.270.520.380.200.420.470.25
Bereich über eine Eigenschaft (100 Werte)0.320.480.370.2123.776.70.26
Zählen eines Labels0.260.463.770.170.4697.99.37
1 Sprung0.260.460.340.190.400.510.27
2 verschiedene Sprünge0.320.510.360.210.450.610.73
3 verschiedene Sprünge0.821.000.510.331.071.375.61
Gruppieren + Top 104.759.6332.314.98.7414562.5
Filter + Aggregat21.216.59.823.415.5178.324.0
Zählen eines Musters (alle KNOWS zwischen Personen)20.922562.431.310182745.9
Heiße Lesevorgänge + eine vollständige Traversierung pro 1000.320.540.400.190.410.530.31
Erste 10 Zeilen eines großen Ergebnisses0.340.550.460.210.600.560.21
Schreiben: 1 Knoten pro Anfrage0.420.550.590.360.560.490.26
Schreiben während einer langen Traversierung0.660.560.6035.00.800.600.28
8 Clients: 1 Sprung16,1358,6099,88228,30210,5254,24916,372
4 Clients: Schreiben6,8425,1923,3144,4233,3643,6759,280

Laden des Graphen

Ohne Index

LastgDownNeo4jMemgraphFalkorDBArcadeDBTuGraphApache AGE
Ladezeit6.48.84.95.815.2110.599.0
Laderate172,107125,063224,642188,30172,4889,95411,115

Mit Indizes auf den Kennungen

LastgDownNeo4jMemgraphFalkorDBArcadeDBTuGraphApache AGE
Ladezeit10.911.06.040.815.2110.599.0
Laderate101,28099,864183,11426,98872,4889,95411,115

Was man daraus mitnimmt

  • FalkorDB ist bei kurzen Operationen (Lesen nach Kennung, Sprünge, Schreiben eines Knotens) und beim Durchsatz mit mehreren Clients am schnellsten, mit dem kürzesten Client-Weg (RESP). Sehen Sie sich „Schreiben während einer langen Traversierung“ an: Seine Schreibvorgänge warten hinter einem langen Lesen; es schreibt standardmäßig nichts Dauerhaftes, und sein Laden mit Indizes ist das langsamste.
  • gDown ist bei den meisten Lasten schneller als Neo4j (geometrisches Mittel unter 1 in beiden Konfigurationen), lädt schneller und hält seine Daten auf weit weniger Plattenplatz. Gleichauf oder langsamer ist es bei den ersten Zeilen eines großen Ergebnisses und beim Schreiben eines Knotens: siehe diese Zeilen.
  • Gegenüber Memgraph gewinnt gDown beim Gruppieren, bei Label-Zählungen und beim Durchsatz mit 8 Clients und verliert bei kurzen Lesevorgängen, Sprüngen und Schreibvorgängen. Memgraph erzwingt seine Commits nicht jedes Mal auf der Platte, anders als gDown und Neo4j.
  • ArcadeDB, immer mit Index gemessen, ist beim Lesen konkurrenzfähig, aber langsam bei Bereichen und bei Schreibvorgängen mit mehreren Clients.
  • Speicher: Die Datenbanken, die alles im RAM halten (Memgraph, FalkorDB), brauchen am wenigsten. gDown und Neo4j laufen hier mit großzügigen Heaps, und gDown kommt mit einem kleineren Heap bei gleichen Latenzen mit weit weniger aus (siehe die native Messung oben).

Was dieser Vergleich nicht sagt

  • Die Dauerhaftigkeit unterscheidet sich: gDown und Neo4j synchronisieren bei jedem Commit auf die Platte; Memgraph nur alle 100 000 Transaktionen; FalkorDB schreibt standardmäßig nichts Dauerhaftes; die Einstellungen der anderen Datenbanken wurden nicht geprüft. Die Schreibzeilen vergleichen daher nicht dieselbe Garantie.
  • Die Datenbanken, die Bolt sprechen, teilen sich denselben Java-Treiber; FalkorDB wird mit einem für den Benchmark geschriebenen minimalen RESP-Client gemessen, der seinen Weg beim Lesen verkürzt (siehe die Spalte Transport).
  • ArcadeDB wird in beiden Tabellen immer mit Index gemessen (seine internen Kennungen schließen die Suche über id() aus); eine Datenbank ohne Wert in einer Konfiguration wurde dort nicht gemessen.
  • Der Graph passt bei allen in den Speicher. Ein Graph größer als der RAM, Replikation, Ausfallübernahme, Vektorsuche, Graphalgorithmen und Lesen während gleichzeitiger Schreibvorgänge sind nicht gemessen. Je Datenbank ein Knoten.
  • ArcadeDB läuft mit unbegrenztem Heap: Seine Speicherzahl ist nicht vergleichbar. Sein Image ist ein Entwicklungsstand.
  • Eine Maschine, die nicht im Leerlauf war, wenige Läufe: Rechnen Sie mit ±10 % pro Zelle.

Quelle: gluonify-gdown, die Rohergebnisse jedes Laufs (docs/bench) und scripts/bench-compare.py, von einem Skript dieser Website zusammengesetzt; das Benchmark-Skript liegt im selben Repository.