It is currently 9 June 2025, 5:09 Advanced search

performance di IDMap vs nested collection foreach

Domande e risposte su come utilizzare Instant Developer Foundation al meglio

performance di IDMap vs nested collection foreach

Postby f.faleschini » 18 April 2024, 16:42

Ciao.

Oggi sono rimasto allibito dalle performance di IdMap rispetto al loop su collection.

Una procedura faceva
Code: Select all
foreach ext in collectionEsterna
{
id document foundObject = null
foreach int in collectionInerna
{
if int.code = ext.code
  foundObject = int


if foundObject
{
fai delle cose su foundObject
}

}

}


e stava minuti

L'ho cambiata sostituendo l'inner loop con una ricerca in una idMap, tipo così

Code: Select all
//riscrivo come mappa la collection interna
foreach int in collectionInerna
{
mapInterna.setObject(int.code, int)
}

foreach ext in collectionEsterna
{
id document  foundObject =null

foundObject = mapInerna.getObject(ext.code)


if foundObject
{
fai delle cose su foundObject
}
}

}


Questa seconda versione impiega meno di un secondo e fa tutto correttamente.

Qual è il limite oltre il quale è meglio usare collection? LA IdMap è tutta in memoria? Nel mio caso avevo collection di 1000 elementi, quindi il nested loop andava sul milione di iterazioni (1000x1000) ed era inchiodato, con la idMap è divenuto quasi istantaneo.

Se penso a quanti nested foreach ho scritto con Inde negli ultimi anni mi viene male...

Che ne dite?
f.faleschini
 
Posts: 1075
Joined: 12 April 2017, 9:09

Re: performance di IDMap vs nested collection foreach

Postby d.termini » 19 April 2024, 6:41

La IDMap usa una interrogazione di tipo hash sulla chiave, questa è estremamente veloce perché praticamente punta direttamente l'oggetto che vuoi recuperare un po' come chiedere la n-esima posizione di un array, le collection invece oltre a ciclarle devi confrontare le proprietà, se ne hai poche o l'oggetto è tra i primi è anche rapido ma sempre un ciclo devi fare, figurati se ne hai 1000 e quello che ti serve è l'ultimo.

Io ho imparato ad usare le IDMap per tenere una cache degli oggetti che so di usare frequentemente all'interno della procedura, ad esempio se sto elaborando migliaia di righe ordine e devo recuperare i dati dell'articolo, lo stesso articolo può essere usato molto di frequente ed è inutile caricarlo ogni riga, lo chiedo direttamente all'IDMap, se non c'è lo carico nell'IDMap con il docID come chiave così ce l'ho al giro successivo.
d.termini
 
Posts: 1656
Joined: 13 November 2017, 8:41

Re: performance di IDMap vs nested collection foreach

Postby f.faleschini » 19 April 2024, 13:23

Grazie per la risposta!

Per la tua esperienza qual è il limite di record entro il quale ha senso usare idMap per fare una cache di oggetti?

1000 è assolutamente ottimo, dalla tua esperienza cosa puoi dire?

Grazie!
f.faleschini
 
Posts: 1075
Joined: 12 April 2017, 9:09

Re: performance di IDMap vs nested collection foreach

Postby d.termini » 19 April 2024, 13:39

Secondo me ha senso usare solo IDMap per fare cache di oggetti
Usi collection solo se devi per forza comparare più proprietà, ma se riesci ad avere una chiave specifica usa sempre IDMap
d.termini
 
Posts: 1656
Joined: 13 November 2017, 8:41

Re: performance di IDMap vs nested collection foreach

Postby t.simoncini » 19 April 2024, 14:24

diciamo che il titolo del thread non proprio preciso: dovrebbe essere "nested loops vs key-value inside loop".
E di conseguenza la risposta viene da se.
t.simoncini
 
Posts: 1585
Joined: 5 March 2012, 14:00

Re: performance di IDMap vs nested collection foreach

Postby f.faleschini » 19 April 2024, 15:33

t.simoncini wrote:diciamo che il titolo del thread non proprio preciso: dovrebbe essere "nested loops vs key-value inside loop".
E di conseguenza la risposta viene da se.


Perdonami, ero sconvolto quando ho scritto il titolo, perché per anni ho peccato.

Però il titolo vero sarebbe "fino a quante volte ha senso chiamare setObject su una idMAp"?

Chiaro che dipende se un object pesa 1kB o 100MB, quindi forse la domanda è quanta RAM ha senso usare per una idMap?

Ogni commento è benvenuto.

Grazie.

Ciao!
f.faleschini
 
Posts: 1075
Joined: 12 April 2017, 9:09

Re: performance di IDMap vs nested collection foreach

Postby t.simoncini » 22 April 2024, 12:37

Non credo che a queste tue ultime domande esista una risposta univoca e generale.
Per esempio, sei su server cloud (Azure, AWS, Google, ecc..)? Paghi di più la ram o la CPU? Quanta RAM/CPU hai? quanti cicli fai? quanti oggetti hai? quanto sono grandi?
Ci sono troppe variabili.
Dovresti fare degli stress test con dati plausibili per il tuo caso, e fare le valutazioni di conseguenza.
t.simoncini
 
Posts: 1585
Joined: 5 March 2012, 14:00

Re: performance di IDMap vs nested collection foreach

Postby d.termini » 22 April 2024, 12:44

E comunque la differenza tra IDMap e Coollection risiede solo nel modo di accesso agli oggetti, sono entrambe in memoria, non è che una collection carica man mano che la cicli, la carichi e basta...
d.termini
 
Posts: 1656
Joined: 13 November 2017, 8:41


Return to Tips & Tricks - Foundation

Who is online

Users browsing this forum: Google [Bot] and 44 guests

cron