Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-04-2006, 12:54   #1
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6399
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 12:57.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2006, 22: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, 22:29   #3
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6399
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 22:34.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2006, 12: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, 16: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, 01: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, 16:23   #7
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6399
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, 21: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, 21: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, 22:48   #10
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6399
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 22:51.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 24-04-2006, 09: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, 09: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, 12:25   #13
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6399
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, 12:29   #14
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6399
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, 12: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, 14: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, 14: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, 14: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, 14: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


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Nuove informazioni sul fallimento del la...
SpaceX: completato parte dell'assemblagg...
Landspace si prepara al secondo lancio d...
Tutti gli sconti Apple su Amazon: tornan...
Altro che entry-level: due smartwatch Am...
Roscosmos ha posticipato (ancora) il lan...
Isar Aerospace si prepara al secondo lan...
Tory Bruno è entrato in Blue Orig...
Fujifilm lancia la cartuccia per archivi...
Dreame H15 Mix: la soluzione 7-in-1 per ...
AirPods Pro 3 in forte sconto su Amazon:...
36 offerte Amazon, molte appena partite:...
2 caricatori multipli eccezionali: da 28...
OLED e 360 Hz a un prezzo senza preceden...
Roborock Q10 S5+ a un prezzo molto conve...
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: 08:08.


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