Quando va bene usare gli array paralleli?

15

Ho eseguito il codice (nuovo codice) che utilizza ciò che io chiamo "Array paralleli" o elenchi. Significa che ci sono 2 array che contengono dati correlati e sono collegati dalla loro posizione (indice) nell'array.

Considero questo confuso e incline a tutti i tipi di errori. La soluzione che di solito propongo è creare un oggetto chiamato Company con i campi CompanyId e CompanyName.

Un esempio molto reale:

List<string> companyNames;
List<int> companyIds;

//...They get populated somewhere and we then process

for(var i=0; i<companyNames.Count; i++)
{
    UpdateCompanyName(companyIds[i],companyNames[i]);
}

Questi array paralleli sono considerati una cattiva pratica ?

    
posta GER 01.06.2017 - 21:51
fonte

3 risposte

23

Ecco alcuni motivi per cui qualcuno potrebbe utilizzare gli array parrel:

  1. In una lingua che non supporta classi o strutture
  2. Per evitare il blocco dei thread quando i singoli thread modificano solo una delle colonne
  3. Quando il metodo di persistenza forza la memorizzazione di queste cose separatamente e le stai ricostituendo.
  4. Possono consumare meno memoria se le strutture sono riempite. (non applicabile per questi tipi di dati in C #)
  5. Quando parti dei dati devono essere tenute vicine per sfruttare in modo efficiente la cache della CPU (non sarebbe di aiuto nel codice precedente).
  6. Uso di codici operativi SIMD (Single Instruction Multiple Data). (non applicabile per questo codice o per tutte le stringhe)

Non vedo alcun motivo valido per fare questo in questo caso ... e ci sono probabilmente opzioni migliori in tutto quanto sopra o non sono così utili in un linguaggio di alto livello.

    
risposta data 01.06.2017 - 21:57
fonte
7

Sono stato colpevole di utilizzare array paralleli . A volte sei all'interno della struttura così tanto che non vuoi pensare a come astrarlo. L'astrazione può essere un po 'più difficile da refactoring, quindi sei riluttante a lanciarlo direttamente fino a quando non hai dimostrato ciò di cui hai veramente bisogno.

A quel punto però vale la pena considerare il refactoring per astrarre i dettagli. Spesso il motivo principale per cui sono riluttante a farlo è che è difficile pensare ad un buon nome.

Se riesci a vedere un buon modo di astrarre array paralleli, fallo sempre. Ma non paralizzarti rifiutandoti di toccarli. A volte un po 'di codice sporco è il miglior trampolino di lancio per un grande codice.

    
risposta data 01.06.2017 - 23:44
fonte
6

Questo pattern è talvolta chiamato anche Struttura degli array (in contrapposizione a Array of Structures) ed è estremamente utile quando codice di vettorizzazione. Piuttosto che scrivere un calcolo che gira su una singola struttura e vettorizzare parti di esso, si scrive il calcolo come si farebbe normalmente, eccetto che con intrinseche SSE in modo che funzioni su 4 strutture invece di una. Questo di solito è più facile e quasi sempre più veloce. Il formato SoA rende questo molto naturale. Migliora anche l'allineamento, il che rende più veloci le operazioni di memoria SSE.

    
risposta data 07.06.2017 - 08:11
fonte

Leggi altre domande sui tag