Gli algoritmi (e l'efficienza in generale) stanno diventando meno importanti?


29

Dato che l'acquisto del potere di calcolo è molto conveniente rispetto al passato, la conoscenza degli algoritmi e l'essere efficienti stanno diventando meno importanti? È chiaro che vorresti evitare un ciclo infinito, quindi non tutto va bene. Ma se hai un hardware migliore, potresti avere un software in qualche modo peggiore?


2
"sia sì che no"!
vzn,

4
Ora che esistono gli aerei e che le merci transatlantiche non devono più salire sulle navi, la velocità di spedizione è meno importante? I clienti FedEx e DHL non la pensano così.
Peter Shor,

2
Se la dimensione dell'input è abbastanza grande, una differenza di ordine di grandezza tra gli algoritmi è importante, indipendentemente dalla velocità della macchina. Ma a volte sono ingannato nel fare cambiamenti per "ottimizzare" una costante differenza di fattore solo per rendermi conto che l'uso di espressioni integrate nello zucchero sintattico del linguaggio di programmazione <cough> Python </cough> è significativamente più veloce della mia "ottimizzazione".
Kojiro,

vedi anche moores law
vzn

un caso di studio interessante qui è ad esempio Windows, che in alcuni / molti modi funziona in modo meno efficiente anche su hardware altamente ottimizzato rispetto al passato ... proprio come la legge moores sta migliorando l'hardware, sembra esserci una corrispondente legge inflazionistica nel software in cui il software moderno sta facendo sempre di più in continuazione, con nuovi livelli aggiunti e moltiplicanti ... in qualche modo analogo al modo in cui un gas riempie tutto il volume disponibile ... o in cui un budget non importa quanto grande o crescente sia sempre utilizzato o un po 'invasa ... vedi anche razza evolutiva
vzn

Risposte:


31

Mi piace molto l'esempio del libro Introduzione agli algoritmi , che illustra il significato dell'efficienza dell'algoritmo:

Confrontiamo due algoritmi di ordinamento: ordinamento inserzione e unione ordinamento . La loro complessità è e O (n \ log n) = c_2n \ lg n rispettivamente. In genere unisci ordinamento ha un fattore costante più grande, quindi supponiamo che c_1 <c_2 . O ( n log n ) = c 2 n lg n c 1 < c 2O(n2)=c1n2O(nlogn)=c2nlgnc1<c2

Per rispondere alla tua domanda, valutiamo i tempi di esecuzione di un computer più veloce (A) che esegue l'algoritmo di ordinamento di inserzione rispetto a un computer più lento (B) che esegue l'algoritmo di ordinamento di tipo merge.

Assumiamo:

  • la dimensione del problema di input è di 10 milioni di numeri: ;n=107
  • il computer A esegue istruzioni al secondo (~ 10GHz);1010
  • il computer B esegue solo istruzioni al secondo (~ 10MHz);107
  • i fattori costanti sono (ciò che è leggermente sopravvalutato) e (in realtà è più piccolo).c 2 = 50c1=2c2=50

Quindi con questi presupposti ci vuole

107

2(107)2 instructions1010 instructions/second=2104 seconds
per il computer A per ordinare numeri e107

50107lg107 instructions107 instructions/second1163 seconds

per il computer B.

Quindi il computer, che è 1000 volte più lento, può risolvere il problema 17 volte più velocemente. In realtà il vantaggio di unire l'ordinamento sarà ancora più significativo e aumenterà con la dimensione del problema. Spero che questo esempio aiuti a rispondere alla tua domanda.

Tuttavia, non si tratta solo della complessità dell'algoritmo. Oggi è quasi impossibile ottenere un aumento di velocità significativo solo utilizzando la macchina con una frequenza della CPU più elevata. Le persone devono progettare algoritmi per sistemi multi-core che si adattano bene. Anche questo è un compito complicato, perché con l'aumento dei core, aumenta anche un sovraccarico (per la gestione degli accessi alla memoria, ad esempio). Quindi è quasi impossibile ottenere uno speedup lineare.

Quindi, per riassumere, la progettazione di algoritmi efficienti oggi è altrettanto importante di prima, perché né l'aumento di frequenza né i core aggiuntivi ti daranno la velocità rispetto a quella introdotta dall'algoritmo efficiente.


4
Vale la pena ricordare che l'impossibilità dello speedup lineare deriva dalla legge di Amdhal .
Bartosz Przybylski,

La legge di Amdhal non è sempre applicabile. Ci sono problemi nella scienza computazionale in cui la frazione del lavoro non parallelizzabile scende a zero all'aumentare della dimensione del problema. Dì che calcolare richiede lavori e devi calcolare per diversi . In seriale il costo del tempo è , mentre in parallelo con processori, il lavoro è . n 2 n i = 1 f ( x i ) n x i s O ( n n 2 + n ) = O ( n 3 ) n O ( n 2 + n ) = O ( n 2 )f(x)n2i=1nf(xi)nxisO(nn2+n)=O(n3)nO(n2+n)=O(n2)
Nick Alger,

"Quindi il computer, che è 1000 volte più lento, è in grado di risolvere il problema 17 volte più velocemente." Questa è una dichiarazione falsa in quanto si stanno combinando velocità hardware e algoritmi diversi allo stesso tempo. Piuttosto, confrontare il computer A con il computer B per ciascun tipo di ordinamento separatamente. (Perché non posso usare l'ordinamento di tipo merge sul computer A o l'ordinamento di inserimenti sul computer B?)
AquaAlex,

3
@AquaAlex, lo scopo dell'esempio è mostrare che il computer lento può superare quello veloce semplicemente mediante l'algoritmo selezionato. Potremmo confrontare i tempi di esecuzione per ogni tipo di ordinamento separatamente o eseguire l'ordinamento di unione su A e l'ordinamento di inserzioni su B. Ma mostrare che un computer più veloce in genere funziona meglio di uno lento non ha senso.
Pavel Zaichenkov,

OK, quindi l'idea era quella di mostrare che un algoritmo più efficiente continua a pesare anche di giorno su CPU più veloci e memoria più grande.
AquaAlex,

36

Anzi. Allo stesso tempo, l'hardware sta diventando più economico, si verificano numerosi altri sviluppi.

Innanzitutto, la quantità di dati da elaborare sta crescendo in modo esponenziale. Ciò ha portato allo studio di algoritmi a tempo quasilineare e all'area dei big data . Pensa ad esempio ai motori di ricerca: devono gestire grandi volumi di query, elaborare grandi quantità di dati e farlo rapidamente. Gli algoritmi sono più importanti che mai.

In secondo luogo, l'area dell'apprendimento automatico sta diventando sempre più forte e piena di algoritmi (sebbene di tipo diverso da quello che apprendi nel tuo BA). L'area è fiorente e ogni tanto viene inventato un algoritmo veramente nuovo e migliora significativamente le prestazioni.

In terzo luogo, gli algoritmi distribuiti sono diventati più importanti, poiché stiamo raggiungendo un blocco nell'aumentare la velocità di elaborazione della CPU . Oggigiorno la potenza di calcolo viene aumentata parallelamente e questo implica algoritmi dedicati.

In quarto luogo, per controbilanciare il crescente potere delle CPU, i moderni paradigmi di programmazione utilizzano metodi di macchine virtuali per combattere le falle nella sicurezza. Ciò rallenta questi programmi di un fattore apprezzabile. Aggiungendo all'enigma, il tuo sistema operativo sta investendo più tempo della CPU su campane e fischietti, lasciando meno tempo della CPU per i tuoi programmi attuali, che potrebbero includere algoritmi ad alta intensità di CPU come la compressione e la decompressione video. Quindi, mentre l'hardware è più veloce, non viene utilizzato in modo efficiente.

Riassumendo, sono necessari algoritmi efficienti per gestire grandi quantità di dati; nuovi tipi di algoritmi stanno spuntando nell'area dell'intelligenza artificiale ; gli algoritmi distribuiti si stanno focalizzando; e la potenza della CPU viene sfruttata in modo meno efficiente per vari motivi (ma principalmente perché i computer stanno diventando più potenti). Gli algoritmi non sono ancora morti.


"Gli algoritmi non sono ancora morti" ... al contrario, probabilmente viviamo attraverso un "periodo d'oro degli algoritmi" ....
vzn

12

La conoscenza degli algoritmi è molto più di come scrivere algoritmi veloci.

Fornisce inoltre metodi di risoluzione dei problemi (ad es. Divisione e conquista, programmazione dinamica, avidità, riduzione, programmazione lineare, ecc.) Che è possibile applicare quando ci si avvicina a un problema nuovo e stimolante. Avere un approccio adeguato di solito porta a codici che sono più semplici e molto più veloci da scrivere. Quindi non sono d'accordo con la risposta di Kevin poiché i codici che non sono stati messi insieme con cura sono spesso non solo lenti ma anche complicati. Mi piace questa citazione di David Parnas:

Sento spesso gli sviluppatori descritti come "qualcuno che sa come costruire rapidamente un sistema di grandi dimensioni". Non vi è alcun trucco nel costruire rapidamente grandi sistemi; più velocemente li costruisci, più diventano grandi!

(Ovviamente, dobbiamo anche combinare algoritmi e metodi di progettazione software per scrivere buoni codici.)

La conoscenza degli algoritmi ci dice anche come organizzare i tuoi dati in modo che tu possa elaborarli in modo più semplice ed efficiente attraverso l'uso di strutture di dati.

Inoltre, ci offre un modo per stimare l'efficienza del vostro approccio e comprendere i compromessi tra diversi approcci in termini di complessità temporale, complessità spaziale e complessità dei codici. Conoscere questi compromessi è la chiave per prendere la decisione giusta nei limiti delle risorse.

Sull'importanza dell'efficienza del software, citerò la legge di Wirth:

Il software sta rallentando più rapidamente di quanto l'hardware diventi più veloce.

Larry Page ha recentemente ribadito che il software rallenta il doppio ogni 18 mesi, superando così la legge di Moore.


7

, sono "relativamente" meno importanti nell'industria ampia. L'editor di testo potrebbe essere "abbastanza veloce" e potrebbe non aver bisogno di molti miglioramenti. Gran parte degli sforzi dell'IT è volta a garantire che il componente A scritto in Java funzioni con il componente B scritto con C comunica correttamente tramite la coda di messaggi scritta in Cobol (o qualcosa del genere), o per portare il prodotto sul mercato ecc.

Inoltre l'architettura si è complicata. Quando avevi semplici semplici processori in cui avevi 1 istruzione per ciclo e scrivevi in ​​assemblea le ottimizzazioni erano "facili" (devi solo contare il numero di istruzioni). Al momento non hai un semplice processore ma un processore completamente pipeline, superscalare e fuori servizio con rinominazione dei registri e cache a più livelli. E non scrivi in ​​assembly ma in C / Java / etc. dove il codice è compilato / JIT (di solito per scrivere un codice migliore di quello che io o te scriveremmo in assembly), o in Python / Ruby / ... dove il codice viene interpretato e tu sei separato da diversi livelli di astrazione dalla macchina. Le microottimizzazioni sono difficili e la maggior parte dei programmatori otterrebbe un effetto opposto.

No , sono sempre più importanti nella ricerca e in termini "assoluti" . Ci sono aree in cui la velocità è importante in quanto operano su grandi quantità di dati. Su questa scala le complessità contano, come mostrato nell'esempio di Pavel.

Tuttavia, ci sono altri casi: scendere dagli algoritmi è ancora un'opzione scelta quando la velocità è importante (HPC, dispositivi integrati, ecc.). Troverai su molti gruppi di università specializzati in compilatori e / o ottimizzazione del software. Ad esempio, un semplice scambio di ordini in loop può ottenere una velocità di mille volte solo perché utilizza la cache in modo efficiente - mentre potrebbe essere un esempio limite, il divario CPU-Memoria aumenta di 1000 volte negli ultimi 30 anni. Anche Computer Architecture fa parte di CS. Pertanto, molti dei miglioramenti nella velocità di calcolo fanno effettivamente parte del campo CS generale.

Sul lato industriale: quando si dispone di un cluster HPC, la velocità è importante perché un singolo programma può essere eseguito per giorni, mesi o anni. Non solo devi pagare la bolletta dell'elettricità, ma anche aspettare può costare denaro. Puoi buttare il doppio dell'hardware ma 700M $ non possono essere considerati un cambiamento tascabile per tutte le società tranne quelle più grandi - in questi casi i programmatori sono l'opzione più economica e se riscrivere il programma in una nuova lingua significa solo un "piccolo" aumento di velocità - potrebbero tieni conto di questo.

Inoltre la velocità potrebbe significare una migliore UX. Molte recensioni del sistema operativo dei telefoni cellulari indicano quale è "più scattante" e mentre può essere fatto con "trucchi" è certamente un'area di studio. Inoltre, vuoi accedere ai tuoi dati più velocemente e fare rapidamente ciò di cui hai bisogno. A volte significa che puoi fare di più: nei giochi hai 0,017 secondi per fare tutto e più veloce sei, più caramelle puoi mettere.


2

È una discussione interessante. E abbiamo alcune cose da guardare qui.

  1. L'informatica teorica - Questa è una scienza in evoluzione che significa che col passare del tempo troveremo modi nuovi e migliori per risolvere i problemi, il che significa algoritmi migliorati per la ricerca e l'ordinamento, ad esempio.

  2. Comunità più grandi / biblioteche più grandi - Poiché è stato svolto molto lavoro da altre persone, possiamo semplicemente basarci sul loro lavoro e utilizzare gli algoritmi che hanno già creato e persino codificato. E queste librerie verranno aggiornate con il tempo permettendoci l'accesso automatico a programmi / algoritmi più efficienti.

  3. Sviluppo - Ora qui abbiamo un problema, penso. Molti programmatori non sono scienziati informatici, quindi scrivono codice per risolvere problemi aziendali e non tecnici / teorici e sarebbero felici di usare un ordinamento a bolle come un ordinamento rapido, ad esempio. E qui la velocità dell'hardware sta permettendo ai programmatori malvagi di cavarsela usando algoritmi cattivi e cattive pratiche di codifica. Memoria, velocità della CPU, spazio di archiviazione non sono più preoccupazioni importanti e ogni pochi mesi le cose diventano più grandi, più veloci ed economiche. Voglio dire, guarda i nuovi cellulari. Ora sono più avanzati dei computer / server mainframe degli anni '70 / '80. Più spazio di archiviazione, più potenza di elaborazione, memoria più veloce.

  4. Interfaccia utente e dati: l'interfaccia utente / esperienza utente e i dati sono ora considerati più importanti del codice super efficiente nella maggior parte delle aree di sviluppo. Quindi la velocità diventa ed emette solo quando un utente deve aspettare a lungo. Se diamo all'utente un bell'aspetto e ottiene una buona risposta dall'applicazione, è felice. E se le aziende sanno che tutti i dati sono archiviati in modo sicuro e possono recuperarli e manipolarli in qualsiasi momento non si preoccupano di quanto spazio hanno bisogno.

Quindi dovrei dire che non è che i programmatori efficienti non siano più importanti o necessari, è solo che pochissime aziende / utenti premiano le persone per essere programmatori super efficienti e, poiché l'hardware è migliore, ci stiamo liberando dell'essere meno efficiente. Ma almeno ci sono ancora persone là fuori che si concentrano sull'efficienza e grazie allo spirito della comunità tutti nel tempo ne traggono beneficio.


1

Alcuni altri punti di vista su questa interessante e profonda domanda che sottolineano gli aspetti interdisciplinari e trasversali del fenomeno. Dai cita la legge di Wirth nella sua risposta:

Il software sta rallentando più rapidamente di quanto l'hardware diventi più veloce.

Ci sono interessanti parallelismi di questa idea con i fenomeni osservati in economia. Si noti che l'economia ha molte connessioni profonde con l'informatica, ad esempio la pianificazione in cui risorse scarse (diciamo thread ecc.) Sono allocate su richiesta, mediante algoritmi di "bilanciamento del carico". Un altro esempio è quello che viene chiamato una coda produttore-consumatore. Inoltre, aste.

Ad esempio, Elenco delle leggi omonime, Wikipedia :

Legge di Parkinson - "Il lavoro si espande in modo da riempire il tempo disponibile per il suo completamento." Coniato da C. Northcote Parkinson (1909–1993), che ha anche coniato il suo corollario, "Le spese aumentano per far fronte al reddito". Nei computer: i programmi si espandono per riempire tutta la memoria disponibile.

C'è una forte somiglianza anche con il paradosso di Jevon che è stato osservato nell'aumento del consumo di energia dopo che i motori a vapore Watt più efficienti hanno iniziato a sostituire il design di Newcomen, ma è aumentato l'uso o la proliferazione dei motori:

In economia, il paradosso di Jevons (/ ˈdʒɛvənz /; a volte effetto Jevons) è la proposizione che il progresso tecnologico che aumenta l'efficienza con cui viene utilizzata una risorsa tende ad aumentare (piuttosto che diminuire) il tasso di consumo di quella risorsa.

L'analogia è che l'hardware è la risorsa e il software è come il consumo della risorsa (aka, domanda vs domanda). Quindi software e hardware (e progressi in ciascuno) esistono in qualche modo in un circuito di feedback simbiotico strettamente accoppiato tra loro, in un certo senso coevolvente . Esistono molti fattori complessi e correlati che influenzano questa interazione, ad esempio:


Perché il downvote? Trovo molto utile la menzione della legge del Parkinson e del paradosso di Jevons.
Yuval Filmus,

@YuvalFilmus La mia ipotesi: problemi con la grammatica. Questa volta non ho trovato fastidioso la mia capacità di leggere troppo la risposta, ma ho cercato di migliorarla.
Juho,

1
Non sono "problemi con la grammatica", è uno stile diverso. È come dire che un madrelingua fa "errori" nel parlare la propria lingua, mentre in realtà o la lingua sta cambiando o c'è una varianza regionale. In questo caso, è lo stile idiomatico di vzn.
Yuval Filmus,

-3

No, soprattutto considerando la complessità dello spazio! La capacità di archiviazione di un normale computer sta crescendo in modo esponenziale.


Non sarebbe vero il contrario: se si dispone di uno spazio di archiviazione "infinito" non è necessario preoccuparsi della complessità dello spazio. Il "problema" non è che l'archiviazione cresce ma che i dati su cui operare crescono in sincronia riempiendo gli speedups offerti dall'aumento della potenza computazionale e della memoria - il che è positivo, vogliamo modellare il cosmo in modo più realistico, piegare più proteine ​​ecc. (PS. Non ho ancora votato)
Maciej Piechotka,

4
È vero che molti sviluppatori di app mobili sembrano assumere infinite risorse, ma sfortunatamente il mio dispositivo è molto limitato.
Raffaello
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.