Objektno-teška reprezentacija grafa zamenjena je
reprezentacijom Compressed Sparse Row (CSR).
Povezanost grafa predstavljena je pomoću dva
primitivna niza:
int[] offsetArray
int[] edgeArray
Za dati čvor, niz offsetArray određuje kontinualni
opseg njegovih izlaznih veza:
start = offsetArray[nodeId]
end = offsetArray[nodeId + 1]
Odgovarajući opseg u nizu edgeArray sadrži
identifikatore susednih čvorova. Traversiranje
zato koristi indeksiranje nizova i sekvencijalan
pristup primitivnim podacima, umesto praćenja
lanaca Java objektnih referenci.
Često korišćene vrednosti metrika čuvaju se odvojeno
u primitivnom nizu long[] metricsArray. Taj niz služi
za pristup metrikama i nije deo CSR strukture
povezanosti koju definišu nizovi offsetArray
i edgeArray.
CSR reprezentacija poboljšava prostornu lokalnost
podataka i omogućava predvidljiviji obrazac pristupa
memorijskoj hijerarhiji procesora i hardverskom
prefetchingu. To ne znači da svako susedstvo
staje u jednu cache liniju.
Dinamičke izmene topologije obrađuju se odvojeno
od ažuriranja metrika. Strukturna izmena asinhrono
gradi novi CSR snapshot. Nizovi topologije ne menjaju
se nakon objavljivanja, pa traversiranje može da
nastavi rad koristeći postojeći snapshot dok se
priprema njegova sledeća verzija.
Kada je novi snapshot spreman, objavljuje se
atomskom zamenom reference putem AtomicReference.
Svako traversiranje zadržava lokalnu referencu
na snapshot sa kojim je započelo, tako da topologija
koju čita ostaje strukturno stabilna tokom celog
traversiranja.
Prethodni snapshot postaje podoban za garbage
collection kada više ne postoje aktivne reference
ka njemu. Time se izbegava potreba da niti za
traversiranje čekaju rekonstrukciju topologije
na mestu.
Često promenljive metrike ažuriraju se na mestu
pomoću atomskih primitiva, umesto da se topologija
ponovo gradi pri svakom telemetrijskom ažuriranju.
Pojedinačna atomska ažuriranja ne znače da sve
metrike predstavljaju jedan transakciono konzistentan
trenutak u vremenu. Arhitektura čuva strukturnu
konzistentnost topologije, dok se telemetrijske
vrednosti kontinuirano menjaju.
Radno stanje traversiranja premešteno je u unapred
alocirane primitivne bafere. Privremene kolekcije,
iteratori i drugi pomoćni objekti koji bi se
alocirali pri svakom izvršavanju uklonjeni su
iz merene hot-path putanje.
Rezultat merenja alokacije odnosi se isključivo
na aplikacionu alokaciju tokom traversiranja.
To ne znači da JVM ili čitava aplikacija nisu
vršili alokacije; kvantifikovani rezultat prikazan
je zasebno u rezultatima merenja.