Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-04-2006, 11:54   #1
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7359
Vector ed iteratori in C++

Sto facendo un risolutore di labirinti in cui uso molti cicli. Per cercare di velocizzare il tutto ho usato i vector e gli iteratori del tipo:

vector<int> nodiaperti;
vector<int>::iterator iteratore_nodiaperti;

I cicli li faccio del tipo:

while(iteratore_nodiaperti!=nodiaperti.end())
{ corpo del while

iteratore_nodiaperti++;
}

Il problema è che non ho notato alcun miglioramento in termini di prestazioni ,anzi in alcuni casi il tempo di risoluzione del labirinto aumenta molto rispetto a quando usavo vettori statici e ci accedevo con un semplice indice intero. Ora mi chiedo, ma i vector, sono più lenti da scorrere rispetto a vettori di int semplici? Hanno molti metodi associati questo è vero, pero' forse perdono in velocità, boh. Premetto che il codice non dà alcun tipo di errore.

Ultima modifica di Unrue : 21-04-2006 alle 11:57.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 21:16   #2
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Hai compilato in Debug o Release?
fek è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 21:29   #3
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7359
Quote:
Originariamente inviato da fek
Hai compilato in Debug o Release?
Ehm, che intendi? Ho compilato con il comando Run del Borland C++ Builder 6. Posso dirti che il programma con i vettori statici lo avviavo direttamente dal file.exe, quello con i vector lo avviavo compilandolo dal compilatore

Ultima modifica di Unrue : 21-04-2006 alle 21:34.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 11:53   #4
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da Unrue
Il problema è che non ho notato alcun miglioramento in termini di prestazioni ,anzi in alcuni casi il tempo di risoluzione del labirinto aumenta molto rispetto a quando usavo vettori statici e ci accedevo con un semplice indice intero. Ora mi chiedo, ma i vector, sono più lenti da scorrere rispetto a vettori di int semplici? Hanno molti metodi associati questo è vero, pero' forse perdono in velocità, boh. Premetto che il codice non dà alcun tipo di errore.
E' chiaro che più aggiungi livelli di astrazione, più rallenti la velocità pura. Fai un bilancio tra la velocità di cui necessiti e quanto l'astrazione ti facilita la vita. Se risparmi molto brain-time, usa costrutti di più alto livello. Altrimenti divertiti con gli array.
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 15:34   #5
84seawolf
Member
 
Iscritto dal: Apr 2006
Messaggi: 89
Risposta

Sebbene le STL siano ottimizzate (per ottimizzate intendo buon compromesso tra velocità di elaborazione e funzioni messe a disposizione), possono capitare casi in cui è vitale una prestazione (in termini di velocità) elevata. In tal caso, se non ti servono tutte le funzioni aggiuntive messe a disposizione dalle STL, ti consiglio di utilizzare gli array statici "classici" sicuramente + veloci.
84seawolf è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2006, 00:49   #6
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Unrue
Ehm, che intendi? Ho compilato con il comando Run del Borland C++ Builder 6. Posso dirti che il programma con i vettori statici lo avviavo direttamente dal file.exe, quello con i vector lo avviavo compilandolo dal compilatore
Puoi compilare l'eseguibile con o senza ottimizzazioni (release o debug). Con tutte le ottimizzazioni attivate il tuo codice che usa std::vector e' perfettamente equivalente alla versione che usa gli array. Senza ottimizzazioni attivate e' invece molto piu' lenta. Assicurati di compilare una versione ottimizzata.

Nel 99.9% dei casi, per te, std::vector e' piu' che efficiente e non ti capitera' mai di aver bisogno di usare gli array nativi.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2006, 15:23   #7
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7359
Quote:
Originariamente inviato da fek
Puoi compilare l'eseguibile con o senza ottimizzazioni (release o debug). Con tutte le ottimizzazioni attivate il tuo codice che usa std::vector e' perfettamente equivalente alla versione che usa gli array. Senza ottimizzazioni attivate e' invece molto piu' lenta. Assicurati di compilare una versione ottimizzata.

Nel 99.9% dei casi, per te, std::vector e' piu' che efficiente e non ti capitera' mai di aver bisogno di usare gli array nativi.
Grazie! Questa non la sapevo.Ma , più in dettaglio, in cosa consistono queste ottimizzazioni? ciao
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2006, 20:22   #8
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Unrue
Grazie! Questa non la sapevo.Ma , più in dettaglio, in cosa consistono queste ottimizzazioni? ciao
Le ottimizzazioni che puo' fare il compilatore sono tantissime. Nel tuo caso quella piu' importante e' l'"inlining": al posto di fare chiamate ai metodi della classe vector, il compilatore e' in grado (in particolari condizioni) di prendere il codice di questi metodi e metterlo direttamente al punto di chiamata, evitando di chiamare il metodo. Il codice che ne esce e' esattamente uguale a quello che tu avresti scritto senza usare la classe vector.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2006, 20:45   #9
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da fek
Le ottimizzazioni che puo' fare il compilatore sono tantissime. Nel tuo caso quella piu' importante e' l'"inlining": al posto di fare chiamate ai metodi della classe vector, il compilatore e' in grado (in particolari condizioni) di prendere il codice di questi metodi e metterlo direttamente al punto di chiamata, evitando di chiamare il metodo. Il codice che ne esce e' esattamente uguale a quello che tu avresti scritto senza usare la classe vector.
ho esperienza passata col BCB (soprattutto con Delphi in realtà), ma da quel poco che ricordo non è come in Visual C++ dove puoi scegliere la configurazione cambiando al volo tutte le opzioni per la command line del compilatore; là si compila sempre allo stesso modo.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2006, 21:48   #10
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7359
Quote:
Originariamente inviato da fek
Le ottimizzazioni che puo' fare il compilatore sono tantissime. Nel tuo caso quella piu' importante e' l'"inlining": al posto di fare chiamate ai metodi della classe vector, il compilatore e' in grado (in particolari condizioni) di prendere il codice di questi metodi e metterlo direttamente al punto di chiamata, evitando di chiamare il metodo. Il codice che ne esce e' esattamente uguale a quello che tu avresti scritto senza usare la classe vector.

Dunque, se non ho capito male, se in un programma so che una funzione verrà chiamata molte volte, conviene dichiararla inline vero? Questo pero' se il corpo della funzione non è troppo grosso. Quali sono le controindicazioni?

Ultima modifica di Unrue : 23-04-2006 alle 21:51.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2006, 08:16   #11
84seawolf
Member
 
Iscritto dal: Apr 2006
Messaggi: 89
come sempre ci sono dei compromessi: utilizzando inline certamente l'esecuzione di funzioni è molto + veloce....

ho detto esecuzione perchè non vengono effettuate chiamate (è come se tu copiassi ogni volta il codice della funzione nel punto in cui viene utilizzata). Tuttavia, specialmente se utilizzi numerose funzioni abbastanza corpose (e le utilizzi spesso), ciò può provocare un'occupazione di memoria notevole.

Scegli in base alle tue specifiche esigenze.
84seawolf è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2006, 08:18   #12
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da Unrue
Dunque, se non ho capito male, se in un programma so che una funzione verrà chiamata molte volte, conviene dichiararla inline vero? Questo pero' se il corpo della funzione non è troppo grosso. Quali sono le controindicazioni?
Non usarlo molto se devi fare una cosa tipo questa
http://www.theprodukkt.com/kkrieger.html
(per chi non ha mai visto un gioco che sta in 96kb!)
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2006, 11:25   #13
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7359
Quote:
Originariamente inviato da shinya
Non usarlo molto se devi fare una cosa tipo questa
http://www.theprodukkt.com/kkrieger.html
(per chi non ha mai visto un gioco che sta in 96kb!)
Come può un gioco in grafica tridimensionale stare in soli 96kb?
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2006, 11:29   #14
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7359
Quote:
Originariamente inviato da 84seawolf
come sempre ci sono dei compromessi: utilizzando inline certamente l'esecuzione di funzioni è molto + veloce....

ho detto esecuzione perchè non vengono effettuate chiamate (è come se tu copiassi ogni volta il codice della funzione nel punto in cui viene utilizzata). Tuttavia, specialmente se utilizzi numerose funzioni abbastanza corpose (e le utilizzi spesso), ciò può provocare un'occupazione di memoria notevole.

Scegli in base alle tue specifiche esigenze.
Nel mio progetto ho una funzione di circa 20 righe che viene chiamata un casino di volte. Ora provo a farla inline
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2006, 11:39   #15
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da Unrue
Come può un gioco in grafica tridimensionale stare in soli 96kb?
Ci sta.
Ma devi essere fuso di testa.
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2006, 13:08   #16
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Unrue
Dunque, se non ho capito male, se in un programma so che una funzione verrà chiamata molte volte, conviene dichiararla inline vero? Questo pero' se il corpo della funzione non è troppo grosso. Quali sono le controindicazioni?
Si', anzi Ni'.

Come regola generale non dichiarare mai nulla inline mentre scrivi il codice, soprattutto in progetti molto grossi, perche' per svariati motivi tende a rallentare di molto la compilazione e... tanto non cambia nulla a livello di velocita' nel 99.99% dei casi se hai un buon compilatore.

La direttiva 'inline' e' solo un consiglio che dai al compilatore e come tutti i consigli il compilatore puo' ignorarli e spesso e volentieri lo fa (secondo alcune metriche sue). Se dichiari inline un metodo molto corposo, sicuramente il compilatore lo ignorera'. Inoltre i compilatori di ultima generazione sono in grado di mettere inline anche metodi che tu non hai dichiarato inline, quando ci sono le condizioni.

In conclusione: non dichiarare nulla inline, e usa un ottimo compilatore. Avrai il meglio dai due mondi.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2006, 13:10   #17
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da shinya
Ci sta.
Ma devi essere fuso di testa.
ci sta ma non funziona più che altro: da me non parte, non penso sia un problema di requisiti.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2006, 13:14   #18
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da Unrue
Nel mio progetto ho una funzione di circa 20 righe che viene chiamata un casino di volte. Ora provo a farla inline
20 righe sono già troppe per l'inline; l'inlining (se non addirittura una bella macro) si usa quando hai del codice che viene usato spesso è che è talmente ridotto da non valere la pena della creazione di uno stack frame e del codice di chiamata a funzione.
per esempio su MFC (un popolare framework a oggetti per la programmazione Win32) molti metodi di alcune classi altro non fanno che chiamare la funzione API Win32 omonima passandogli un handle ricavato dal this; tutti quei metodi sono inline, ed è un'ottima scelta perché se non lo fossero avresti al momento della chiamata due stack frames letteralmente identici anziché uno. e nota bene che sono tutti metodi da una sola riga di codice, perché devono solo fare la chiamata
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2006, 13:21   #19
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da 71104
ci sta ma non funziona più che altro: da me non parte, non penso sia un problema di requisiti.
Strano...io la provai a suo tempo quando uscì. Usi xp o qualcos'altro? (un mio amico usa win 2003 server e ha qualche problema con queste cose)

Comunque, sta in 96kb...quindi qualche problema di compatibilità gliela possiamo pure tollerare
shinya è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Avio si prepara ai test del Dimostratore...
Space Pioneer ha annunciato le cause del...
Anthropic avrebbe nuovi antibiotici cont...
Scoperto un 'moltiplicatore nascosto' ne...
DREO: a IFA 2026 4 novità fra cui...
Slackbot genera dashboard e microsite de...
Idrogeno, nuova cella a combustibile rag...
Con la NASA fuori dai giochi, l'ESA risc...
Una falla di ChatGPT permette di estrapo...
Piano clima, 1,34 miliardi per il bonus ...
Porsche esce definitvamente da Bugatti R...
NVIDIA App aggiunge una delle funzioni p...
Come sarebbe il mondo se la luce viaggia...
Titanio, ceramica e zaffiro per HUAWEI W...
Taglio delle accise sul gasolio prorogat...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 06:06.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v