Inizializzazione oggetto «pesante»: all'interno di ogni thread o all'esterno e quindi passarlo ai thread come parametro?

1

Diciamo che c'è una serie di stringhe, che devo elaborare. Sto usando un oggetto di terza parte «pesante» che ottiene la stringa ed esegue la sua analisi. Per ottimizzare una performance, creo un numero di thread (in base a un numero di core della CPU), separo la matrice al numero di sotto-array e ogni thread esegue la logica descritta sopra con la sua porzione di stringhe.

Ho due opzioni:

  1. Per eseguire i thread e all'interno di ciascun thread, inizializzare questo oggetto «pesante» di terza parte e passare le stringhe. Ciò significa che inizializzo l'oggetto «pesante» in base a un numero di thread.
  2. Per inizializzare una volta questo oggetto «pesante» e passare il riferimento a questo oggetto a ciascun thread.

L'approccio n. 2 mi sembra più corretto, quindi risparmia un'inizializzazione di oggetto «pesante» supplementare.

La mia domanda:
Ci sono insidie o mancanze di progettazione con l'implementazione dell'approccio n. 2?

    
posta Mike B. 21.03.2016 - 19:56
fonte

1 risposta

2

Non esiste un modo corretto o errato senza sapere quale problema stai risolvendo e come lo stai risolvendo. Ci sono diversi fattori in gioco.

Alcuni problemi hanno un'inizializzazione costosa che può essere parallelizzata per ottenere prestazioni migliori. Alcuni eseguono lo stesso o peggio quando sono in parallelo.

Supponendo che la parallelizzazione non aiuti con l'inizializzazione, c'è un secondo problema. A volte condividere lo stesso oggetto di grandi dimensioni tra i thread rallenta le cose perché devono competere per accedervi.

Supponendo che la parallelizzazione aiuti nell'inizializzazione, a volte con più copie la cache del processore condivisa tra i core va in overflow, rallentando le cose rispetto a una copia anche se si tiene conto del tempo di inizializzazione e della competizione per l'accesso.

Sono sicuro che ci sono anche altri fattori.

A meno che tu non sia abile nel capire tutto questo materiale davvero complesso, ti consiglio di implementarlo in tre modi (un oggetto condiviso, un'inizializzazione suddivisa in copie e più inizializzazioni) e profilare ciascuno con esempi che si adattino uso del mondo. Scopri quale strategia ha un rendimento migliore empiricamente.

    
risposta data 21.03.2016 - 20:09
fonte

Leggi altre domande sui tag