Che cos'è il "sovraccarico"?


149

Sono uno studente in Informatica e sento parlare "sovraccarico" molto quando si tratta di programmi e specie. Cosa significa esattamente?


27
quanta "roba extra" devi fare per ottenere qualcosa. ad esempio, se devo caricare un progetto di 37 classi solo per stampare "Hello World", lo prenderei molto in considerazione.
scunliffe,

1
@ doug65536 In realtà è il contrario. =)
Yukio Fukuzawa,

Risposte:


177

Sono le risorse necessarie per impostare un'operazione. Potrebbe sembrare non correlato, ma necessario.

È come quando devi andare da qualche parte, potresti aver bisogno di una macchina. Ma sarebbe un sacco di spese generali per ottenere una macchina per guidare in fondo alla strada, quindi potresti voler camminare. Tuttavia, le spese generali varrebbero la pena se attraversassi il paese.

Nell'informatica, a volte usiamo le macchine per andare in strada perché non abbiamo un modo migliore, o non vale la pena il nostro tempo per "imparare a camminare".


84
Un'analogia simile sarebbe volare. Gli aerei sono molto più veloci delle auto, ma il sovraccarico di check-in in aeroporto, sicurezza, ecc. Rende le auto un'opzione migliore per le distanze più brevi.
FogleBird,

s / drive / go / (Se hai bisogno di guidare da qualche parte, di solito non decidi di camminare ...
RCIX

1
@ inf3rno L'ironia? Come arriviamo alla nostra macchina? Noi camminiamo. E possiamo camminare totalmente ... verso la nostra macchina. Non possiamo raggiungere a piedi la nostra destinazione, anche se è più vicina della nostra auto.
corsiKa,

Se dovessi dire che scrivo un codice Java basso, come lo interpreteresti in termini di definizione di "risorse necessarie per impostare un'operazione". Il mio codice non richiede molta configurazione?
committedandroider

Bene, devi accendere il computer o il server, devi caricare il sistema operativo e tutti i driver, devi avviare il processo Java, devi accendere la JVM, devi caricare tutte le tue classi, tu devi sincronizzare l'IO buffer con la console solo per poter fare il tuo "ciao mondo". Per favore, dimmi di più sulla codifica ambientale bassa.
corsiKa

40

Il significato della parola può differire molto dal contesto. In generale, sono le risorse (il più delle volte memoria e tempo della CPU) che vengono utilizzate, che non contribuiscono direttamente al risultato previsto, ma sono richieste dalla tecnologia o dal metodo che viene utilizzato. Esempi:

  • Sovraccarico del protocollo : i frame Ethernet, i pacchetti IP e i segmenti TCP hanno tutti intestazioni, le connessioni TCP richiedono pacchetti di handshake. Pertanto, non è possibile utilizzare l'intera larghezza di banda di cui l'hardware è in grado per i dati effettivi. È possibile ridurre le spese generali utilizzando pacchetti di dimensioni maggiori e UDP ha un'intestazione più piccola e nessuna stretta di mano.
  • Overhead della memoria della struttura dei dati : un elenco collegato richiede almeno un puntatore per ogni elemento che contiene. Se gli elementi hanno le stesse dimensioni di un puntatore, ciò significa un sovraccarico di memoria del 50%, mentre un array può potenzialmente avere un sovraccarico dello 0%.
  • Overhead di chiamata del metodo : un programma ben progettato è suddiviso in molti metodi brevi. Ma ogni chiamata di metodo richiede l'impostazione di un frame stack, la copia dei parametri e un indirizzo di ritorno. Ciò rappresenta un sovraccarico della CPU rispetto a un programma che fa tutto in un'unica funzione monolitica. Ovviamente, l'ulteriore manutenibilità ne vale la pena, ma in alcuni casi, l'eccessiva chiamata al metodo può avere un impatto significativo sulle prestazioni.

Sembra che la parola abbia lo stesso significato in tutti quegli esempi (necessario per eseguire l'attività, ma non sempre correlato a svolgerla direttamente)
RCIX

Riguardo alla memoria della struttura dei dati: con la maggior parte degli allocatori di memoria, è anche peggio di così. Ogni valore restituito da mallocha un sovraccarico incorporato di 8 byte a causa dell'allocatore (presupponendo una macchina classica a 32 bit) costituito dalla dimensione del blocco più i valori di guardia. E questo prima ancora di pensare alla granularità di allocazione. Un elenco singolarmente collegato di semplici numeri interi a 4 byte avrà quindi un overhead del 75%; gli array sono molto migliori (a meno che non sia necessario un rapido inserimento nel mezzo) perché possono avere l'overhead una volta (o meno, se l'array non è allocato dinamicamente).
Donal Fellows,

19

Sei stanco e non puoi più lavorare. Tu mangi cibo. L'energia spesa per cercare cibo, ottenerlo e mangiarlo effettivamente consuma energia ed è sovraccarico!

Il sovraccarico è qualcosa di sprecato per svolgere un compito. L'obiettivo è rendere le spese generali molto ridotte.

In informatica diciamo che vuoi stampare un numero, questo è il tuo compito. Ma memorizzare il numero, impostare il display per stamparlo e chiamare le routine per stamparlo, quindi accedere al numero dalla variabile sono tutte spese generali.


17

Wikipedia ci ha coperto :

Nell'informatica, l' overhead è generalmente considerato qualsiasi combinazione di tempo di calcolo in eccesso o indiretto, memoria, larghezza di banda o altre risorse necessarie per raggiungere un determinato obiettivo. È un caso speciale di spese generali di ingegneria.


4
Ma in caso contrario, dovresti correggere WikiPedia e quindi pubblicare lo stesso post qui.
SamGoody,

11

L'overhead in genere si riferisce alla quantità di risorse extra (memoria, processore, tempo, ecc.) Che richiedono diversi algoritmi di programmazione.

Ad esempio, il sovraccarico dell'inserimento in un albero binario bilanciato potrebbe essere molto più grande dello stesso inserto in un semplice elenco collegato (l'inserimento richiederà più tempo, utilizzare una maggiore potenza di elaborazione per bilanciare l'albero, il che si traduce in un tempo di funzionamento percepito più lungo di l'utente).


5

Per un programmatore l'overhead si riferisce a quelle risorse di sistema che vengono consumate dal codice quando è in esecuzione su una piattaforma di offerta su un determinato set di dati di input. Di solito il termine viene utilizzato nel contesto del confronto tra diverse implementazioni o possibili implementazioni.

Ad esempio, potremmo dire che un particolare approccio potrebbe comportare un notevole sovraccarico della CPU, mentre un altro potrebbe comportare un sovraccarico di memoria e un altro potrebbe essere pesato sull'overhead di rete (e comportare una dipendenza esterna, ad esempio).

Facciamo un esempio specifico: calcola la media (media aritmetica) di un insieme di numeri.

L'approccio ovvio è quello di passare in rassegna gli input, mantenendo un totale parziale e un conteggio. Quando viene rilevato l'ultimo numero (segnalato da "fine del file" EOF, o un valore di sentinella, o qualche pulsante della GUI, qualunque cosa), allora semplicemente dividiamo il totale per il numero di input e abbiamo finito.

Questo approccio non comporta quasi alcun sovraccarico in termini di CPU, memoria o altre risorse. (È un compito banale).

Un altro possibile approccio è quello di "slurp" l'input in un elenco. scorrere l'elenco per calcolare la somma, quindi dividerlo per il numero di elementi validi dall'elenco.

In confronto, questo approccio potrebbe comportare quantità arbitrarie di sovraccarico di memoria.

In una particolare cattiva implementazione potremmo eseguire l'operazione di somma usando la ricorsione ma senza eliminazione della coda. Ora, oltre al sovraccarico di memoria per il nostro elenco, stiamo anche introducendo un sovraccarico di stack (che è un diverso tipo di memoria ed è spesso una risorsa più limitata rispetto ad altre forme di memoria).

Un altro approccio (probabilmente più assurdo) sarebbe quello di pubblicare tutti gli input in una tabella SQL in un RDBMS. Quindi semplicemente chiamando la funzione SQL SUM su quella colonna di quella tabella. Ciò sposta il sovraccarico della memoria locale su qualche altro server e comporta sovraccarico della rete e dipendenze esterne sulla nostra esecuzione. (Si noti che il server remoto può o meno avere un particolare sovraccarico di memoria associato a questa attività, ad esempio, è possibile che tutti i valori vengano immediatamente archiviati nello spazio di archiviazione).

Ipoteticamente potrebbe prendere in considerazione un'implementazione su una sorta di cluster (possibilmente per rendere fattibile la media di trilioni di valori). In questo caso, qualsiasi codifica e distribuzione necessaria dei valori (mappandoli ai nodi) e la raccolta / fascicolazione dei risultati (riduzione) contano come spese generali.

Possiamo anche parlare delle spese generali sostenute da fattori al di là del codice del programmatore. Ad esempio, la compilazione di alcuni codici per processori a 32 o 64 bit potrebbe comportare un sovraccarico maggiore di quello che si potrebbe vedere per una vecchia architettura a 8 o 16 bit. Ciò potrebbe comportare un sovraccarico di memoria maggiore (problemi di allineamento) o un sovraccarico della CPU (in cui la CPU è costretta a regolare l'ordinamento dei bit o utilizzare istruzioni non allineate, ecc.) O entrambi.

Nota che lo spazio su disco occupato dal tuo codice e dalle sue librerie, ecc. Di solito non è indicato come "overhead", ma piuttosto è chiamato "footprint". Anche la memoria di base consumata dal programma (indipendentemente da qualsiasi set di dati che sta elaborando) viene chiamata anche "footprint".


3

Il sovraccarico è semplicemente il maggiore tempo impiegato nell'esecuzione del programma. Esempio ; quando chiamiamo una funzione e il suo controllo viene passato nel punto in cui è definito e quindi viene eseguito il suo corpo, ciò significa che facciamo eseguire alla nostra CPU un lungo processo (passando prima il controllo in un altro posto in memoria e quindi eseguendo lì e poi riportando il controllo nella posizione precedente), di conseguenza ci vuole molto tempo di esecuzione, quindi Overhead. I nostri obiettivi sono ridurre questo sovraccarico usando l'inline durante la definizione della funzione e il tempo di chiamata, che copia il contenuto della funzione alla chiamata della funzione, quindi non passiamo il controllo in un'altra posizione, ma continuiamo il nostro programma in una linea, quindi in linea .


2

Potresti usare un dizionario. La definizione è la stessa Ma per risparmiare tempo, Overhead è un lavoro necessario per svolgere il lavoro produttivo. Ad esempio, un algoritmo funziona e fa un lavoro utile, ma richiede memoria per fare il suo lavoro. Questa allocazione di memoria richiede tempo e non è direttamente correlata al lavoro svolto, pertanto è un sovraccarico.


1

Puoi controllare Wikipedia . Ma soprattutto quando vengono utilizzate più azioni o risorse. Come se avessi familiarità con .NET, puoi avere tipi di valore e tipi di riferimento. I tipi di riferimento hanno un sovraccarico di memoria in quanto richiedono più memoria rispetto ai tipi di valore.


1

Un esempio concreto di sovraccarico è la differenza tra una chiamata di procedura "locale" e una chiamata di procedura "remota".

Ad esempio, con l'RPC classico (e molti altri framework remoti, come EJB), una chiamata di funzione o metodo ha lo stesso aspetto di un programmatore, che si tratti di una chiamata di rete locale, in memoria o distribuita.

Per esempio:

service.function(param1, param2);

È un metodo normale o remoto? Da quello che vedi qui non puoi dirlo.

Ma puoi immaginare che la differenza nei tempi di esecuzione tra le due chiamate sia drammatica.

Pertanto, mentre l'implementazione di base "costerà lo stesso", l '"overhead" coinvolto è piuttosto diverso.


1

Pensa al sovraccarico come al tempo necessario per gestire i thread e coordinarli. È un onere se il thread non ha abbastanza compiti da svolgere. In tal caso, i costi generali superano il tempo risparmiato grazie all'utilizzo del threading e il codice impiega più tempo di quello sequenziale.


-2

è qualcosa di diverso dai dati stessi, ad esempio flag tcp, header, crc, fcs ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.