Domanda

Ogni piccolo elaborazione del database può essere facilmente affrontato da Python / Perl / ... script, che utilizza le librerie e / o persino utilità dal linguaggio stesso. Tuttavia, quando si tratta di prestazioni, le persone tendono a raggiungere per linguaggi C / C ++ / basso livello. La possibilità di adattare il codice per i bisogni sembra essere ciò che rende queste lingue così attraente per BigData - che si tratti di materia di gestione della memoria, il parallelismo, l'accesso al disco, o anche ottimizzazioni di basso livello (tramite costrutti di montaggio a livello C / C ++).

Naturalmente tale insieme di benefici non sarebbe venuto senza un costo: la scrittura del codice, e talvolta anche reinventare la ruota , può essere molto costoso / faticoso. Anche se ci sono un sacco di librerie disponibili, le persone sono inclini a scrivere il codice da loro stessi ogni volta che hanno bisogno di borsa prestazioni. Ciò che disabilita affermazioni prestazioni da utilizzare librerie durante l'elaborazione di grandi basi di dati?

Per esempio, si consideri un entreprise che striscia continuamente le pagine web e analizza i dati raccolti. Per ogni finestra scorrevole, diversi algoritmi di data mining vengono eseguite sui dati estratti. Perché i sviluppatori fosso off utilizzando disponibili biblioteche / quadri (sia per la scansione, l'elaborazione del testo, e data mining)? Utilizzando roba già implementato sarebbe non solo alleggerire il carico di codificare l'intero processo, ma anche farebbe risparmiare un sacco di tempo.

In un solo colpo :

  • ciò che rende la scrittura del codice da soli un garanzia di prestazioni?
  • perché è rischioso di fare affidamento su un framework / librerie quando si deve assicurare ad alte prestazioni?
È stato utile?

Soluzione

Dopo aver fatto il gioco di riscrittura più e più volte io stesso (e ancora facendo), la mia reazione immediata è stata adattabilità .

Mentre i quadri e le biblioteche hanno un enorme arsenale di routine (possibilmente intertwinable) per operazioni standard, la loro proprietà quadro spesso (sempre?) Disabilita scorciatoie. Infatti, la maggior parte dei quadri hanno una sorta di circa nucleo infrastruttura che è implementato uno strato di nucleo di funzionalità di base. funzionalità più specifica fa uso dello strato di base ed è posto in un secondo strato attorno al nucleo.

Ora da scorciatoie che significa andare direttamente da un secondo routine di livello a un altro secondo routine di livello senza utilizzare il nucleo. Esempio tipico (dal mio dominio) sarebbe timestamp: avete una fonte di dati timestamp di qualche tipo. Finora il lavoro è semplicemente quello di leggere i dati fuori il filo e passarlo al nucleo in modo che il loro codice può banchettare con esso.

Ora il vostro settore cambia il formato predefinito timestamp per una buona ragione (nel mio caso sono andati da tempo unix al tempo GPS). A meno che il quadro è specifici del settore è molto improbabile che essi sono disposti a modificare la rappresentazione nucleo di tempo, quindi si finisce per utilizzare un framework che quasi fa quello che vuoi. Ogni volta che si accedere ai dati è necessario convertirlo in industria-tempo formato un primo momento, e ogni volta che si desidera modificare è necessario riconvertirlo in qualunque siano le Deems fondamentali appropriati. Non c'è modo che si può consegnare i dati direttamente dalla fonte a un lavandino, senza doppia conversione.

Questo è dove i tuoi quadri realizzati a mano brilleranno, è solo una piccola modifica e sei tornato modellare il mondo reale, mentre tutti gli altri (non-industria-specifiche) quadri avranno ora uno svantaggio prestazioni.

Nel corso del tempo, la discrepanza tra il mondo reale e il modello si sommano. Con un quadro off-the-shelf si sarebbe presto essere di fronte a domande come: Come posso rappresentare this in that o come faccio fare di routine X accettare / prodotti Y

.

Finora questo non si trattava di C / C ++. Ma se, per qualche motivo, non è possibile modificare il quadro, vale a dire si ha a mettere in su con doppia conversione dei dati per andare da un capo all'altro, allora si sarebbe tipicamente impiegano qualcosa che minimizza l'onere aggiuntivo. Nel mio caso, un Tai> UTC o UTC-> convertitore TAI è meglio lasciare a C grezzo (o un FPGA). Non v'è alcun eleganza possibile, nessuna struttura dati intelligente profonda che rende il problema banale. E 'solo un'istruzione switch noioso, e perché non usare un linguaggio il cui compilatori sono bravi a ottimizzare esattamente questo?

Altri suggerimenti

Non credo che raggiunge tutti per C / C ++ quando le prestazioni sono un problema.

Il vantaggio di scrittura di codice di basso livello utilizza meno cicli di CPU, o talvolta, meno memoria. Ma mi piacerebbe notare che linguaggi di alto livello possono chiamare fino al livello inferiore lingue, e da fare, per avere un po di questo valore. Python e JVM lingue possono fare questo.

Lo scienziato dati utilizzando, per esempio, scikit-learn sul suo desktop è già chiamando pesantemente ottimizzato routine nativi per fare il numero scricchiolio. Non ha senso per iscritto nuovo codice per la velocità.

Nel contesto distribuito "big data", si è più tipicamente collo di bottiglia per lo spostamento dei dati: trasferimento della rete e I / O. codice nativo non aiuta. Ciò che aiuta non sta scrivendo lo stesso codice per correre più veloce, ma la scrittura di codice più intelligente.

lingue di livello superiore stanno per lasciare che si implementa algoritmi distribuiti più sofisticati in un determinato periodo di tempo gli sviluppatori di C / C ++. A scala, l'algoritmo intelligente con una migliore circolazione dei dati batterà codice nativo muto.

E 'anche vero che il tempo di solito gli sviluppatori, e gli insetti, i carichi di costi più di un nuovo hardware. Un anno di tempo di uno sviluppatore senior potrebbe essere $ 200K a pieno carico; più di un anno che affitta anche centinaia di server vale la pena di tempo di calcolo. Si può solo ha senso nella maggior parte dei casi di preoccuparsi ottimizzare sopra gettare più hardware a questo.

Non capisco il follow-up di "borsa di studio" e "Disattiva" e "assert"?

Come tutti sappiamo, nel mondo digitale ci sono molti modi per fare lo stesso lavoro / ottenere i risultati attesi ..

e responsabilità / rischi che deriva dal codice sono sulle spalle degli sviluppatori ..

Questa è piccola ma immagino un esempio molto utile dal mondo .NET ..

Molti sviluppatori .NET utilizzare il built-in BinaryReader - controllo BinaryWriter sul loro serializzazione dei dati per le prestazioni / superare il processo ..

Questa è CSharp codice sorgente di costruito in classe BinaryWriter quello del quadro dei metodi di scrittura di overload:

// Writes a boolean to this stream. A single byte is written to the stream
// with the value 0 representing false or the value 1 representing true.
// 
public virtual void Write(bool value) 
{
     //_buffer is a byte array which declared in ctor / init codes of the class
    _buffer = ((byte) (value? 1:0));

    //OutStream is the stream instance which BinaryWriter Writes the value(s) into it.
    OutStream.WriteByte(_buffer[0]);
}

Come si può vedere, questo metodo potrebbe scritto senza l'assegnazione in più per _buffer variabile:

public virtual void Write(bool value) 
{
    OutStream.WriteByte((byte) (value ? 1 : 0));
}

senza assegnare potremmo guadagnare qualche milliseconds..This pochi millisecondi possono accettare come "quasi nulla", ma cosa succede se ci sono multi-migliaia di scrittura (cioè in un processo server)?

Consente supponiamo che "pochi" è 2 (millisecondi) e multi-Migliaia casi sono solo 2.000 .. Questo significa 4 secondi più tardi di processo time..4 secondi tornare ..

Se continuiamo a soggetto dal .NET e se è possibile controllare i codici sorgente di BCL - .NET Base Class Library- da MSDN si può vedere un sacco di losts prestazioni da parte dello sviluppatore decide ..

Qualsiasi del punto dalla fonte BCL E 'normale che si vede lo sviluppatore ha deciso di utilizzare, mentre () o foreach () loop che potrebbe implementare un ciclo più veloce per () nel loro codice.

Questa piccoli guadagni ci danno la prestazione totale ..

E se torniamo alla BinaryWriter.Write () Metodo ..

In realtà più di assegnare ad un'implementazione _buffer non è un fault..This sviluppatore è esattamente decidono di "soggiorno a sicuro"!

Supponiamo che decidiamo di non usare per _buffer e ha deciso di attuare la seconda method..If proviamo a trasmettere multi-byte migliaia su un filo (cioè upload / download di dati BLOB o CLOB) con il secondo metodo, si può riusciamo comunemente a causa del collegamento lost..Cause proviamo a trasmettere tutti i dati senza alcun controllo e collegamento di controllo mechanism.When perso, sia il server e il client sa mai i dati inviati a termine o meno.

Se lo sviluppatore decide "soggiorno a sicura", quindi normalmente significa costi delle prestazioni dipende implementato "soggiorno sicuro" meccanismo (s).

Ma se lo sviluppatore decide "get rischioso, prestazioni guadagno" questo non è un difetto also..Till ci sono alcune discussioni sulla "a rischio" di codifica.

E come una piccola nota:. Sviluppatori libreria commerciale cerca sempre di rimanere in sicurezza perché non possono sapere dove utilizzerà il codice

Venendo da un punto di vista i programmatori, quadri raramente obiettivo di performance, come la priorità più alta. Se la libreria sta per essere ampiamente sfruttato le cose che le persone tendono a maggior valore sono la facilità d'uso, flessibilità e affidabilità.

Le prestazioni sono generalmente valutato in librerie competitivi secondari. "Biblioteca X è meglio perché è più veloce." Anche allora molto frequentemente queste librerie saranno trade off la soluzione più ottimale per uno che può essere ampiamente sfruttato.

Utilizzando qualsiasi quadro che si sta assumendo per sé un rischio che esiste una soluzione più veloce. Potrei andare fino a dire che una soluzione più veloce esiste quasi sempre.

Scrivere qualcosa di te stesso non è una garanzia di prestazioni, ma se si sa cosa si sta facendo e hanno un insieme piuttosto limitato di requisiti può aiutare.

Un esempio potrebbe essere JSON parsing. Ci sono un centinaio di librerie là fuori per una varietà di lingue che si trasformerà in un oggetto JSON riferibile e viceversa. So di un applicazione che fa tutto in registri della CPU. E 'misurabile più veloce di tutti gli altri parser, ma è anche molto limitata e che la limitazione può variare in base a ciò che CPU si sta lavorando.

E 'il compito di costruire un ambiente specifico JSON alta performante parser una buona idea? Vorrei sfruttare una libreria rispettata 99 volte su 100. In quella un'istanza separata pochi cicli di CPU in più moltiplicati per un milione di iterazioni renderebbe i tempi di sviluppo vale la pena.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top