Erlang: implicazioni di memoria di passaggio intorno a oggetti di grandi dimensioni in / a funzioni

0

C'è una penalità di memoria nel passare oggetti di grandi dimensioni (come un'intera richiesta HTTP, o il contenuto blob di un file caricato) tra le funzioni all'interno dello stesso processo (Erlang)?

Comprendo che Erlang passa argomenti in base al valore. Ciò significherebbe passare oggetti di grandi dimensioni significa che il loro "valore" viene passato ogni volta che viene chiamata una funzione con quell'oggetto come argomento.

Per rendere le cose più concrete, considera in pseudocodice due modi di fare esattamente la stessa cosa.

Metodo 1

X = <<......>>, %X is a very large binary
Value1 = prelim_fun(X), %Value1 is a smaller object, e.g. a hash
FinalValue = final_fun(Value1).

final_fun(Value1) ->
    FinalValue = further_fun(Value1),
    FinalValue. 

Metodo 2

 X = <<......>>, %X is a very large binary
 FinalValue = final_fun(X).

 finalfun(X) ->
    Value1 = prelim_fun(X), 
    FinalValue = further_fun(Value1),
    FinalValue. 

Nel primo caso, vengono passati solo i risultati di un calcolo preliminare, mentre nel secondo il blob grande viene passato direttamente alla funzione. Il primo metodo ha un'impronta di memoria più leggera?

Non si tratta di micro-ottimizzazione. Quando un sistema si occupa di file di grandi dimensioni, decidere se passare l'intero file quando un semplice hash è sufficiente, potrebbe, SE ogni chiamata di funzione consuma memoria in proporzione agli argomenti, letteralmente crea o interrompe il sistema. Considerando numeri pratici: se ogni blob di file è una media di 10 MB e ogni hash è 10 KB, la differenza potrebbe essere letteralmente 1000 volte. NON è un'ottimizzazione "micro".

PS: Poiché questa domanda sembra avere 2 upvotes e 2 downvotes finora, potrei chiedere a eventuali downvoters futuri di essere abbastanza gentili da spiegare perché pensano che questa sia una domanda così terribile per questo sito?

    
posta Yogesch 14.06.2018 - 20:30
fonte

1 risposta

3

Dato che non si specifica quale implementazione si usa, è difficile dirlo. La specifica di Erlang non garantisce alcuna ottimizzazione specifica tranne le chiamate a coda corretta. Quindi, devi assumere il peggio.

Tuttavia, se si utilizza Erjang o BEAM / HiPE, se ricordo correttamente, entrambi passano gli argomenti all'interno di un processo e tra processi sulla stessa VM tramite puntatori immutabili alla memoria condivisa, quindi si paga solo il costo della copia del puntatore.

Ma tieni presente che questa è solo un'ottimizzazione eseguita da alcune implementazioni, non è garantita dalle specifiche.

    
risposta data 15.06.2018 - 14:13
fonte

Leggi altre domande sui tag