|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Feb 2005
Messaggi: 127
|
static vs instance: quale dei due è più efficiente?
Salve a tutti,
sto imparando il c++ e avrei una domanda (che riguarda anche gli altri linguaggi): qualcuno sa dirmi la differenza in termini di efficienza (sia di velocità d'esecuzione sia in termini di memoria occupata) tra: class pippo { private int pluto; private int pinco; public void esegui(void){ pluto = 5; pinco=4; stampa(pluto+pinco); } } class pippo { static public void esegui (int x,int y){x=5;y=4; stampa(x+y)} } So che usando metodi statici non si passa il riferimento a this ma comunque si usano due parametri in piu'.. accedere alle variabili d'istanza poi? è molto inefficiente? ciao e grazie anticipatamente
__________________
the AUSTRALOPITECI |
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
posto che non é una domanda che riguarda il C++ ma casomai la specifica implementazione del compilatore nonché la potenza dell'instruction set della macchina target, in linea di principio le performances sono equivalenti a meno che non si verifichino condizioni particolari che permettono al compilatore di stravolgere il codice effettuando forti ottimizzazioni a favore di un caso o dell'altro.
di conseguenza non é in termini di efficienza e di performances che devi ragionare quando ti trovi di fronte a quesiti del genere, ovvero non in termini di tempo-macchina, bensi di tempo-uomo che é molto piu importante del tempo macchina (siamo ben disposti a sacrificare un 10% di performance in cambio di un 10% di tempo in meno per il completamento del progetto); quindi in sostanza devi ragionare in termini di ingegneria del software: l'uso delle classi ti permette sostanzialmente di risparmiarti il passaggio di due parametri, e quando si tratta di semplificare decine di migliaia di righe di codice conta tanto anche quello. |
|
|
|
|
#3 | |
|
Member
Iscritto dal: Feb 2005
Messaggi: 127
|
Quote:
E' scritto in tutti i testi di evitare le variabili globali. Essendo le variabili d'istanza simili a delle variabili globali, le si dovrebbero evitare il più possibile giusto (parlo sempre in termini di prestazioni)?
__________________
the AUSTRALOPITECI |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Si dice di evitare le variabili globali unicamente per un discorso di ingegneria del software, cioè per l'Incapsulamento dei dati...
non ha niente a che vedere con le prestazioni, e serve soprattutto per creare librerie più coerenti e stabili, e quindi facili da usare. Cmq, anche se ci fosse una differenza fra static e non, probabilmente oggi è insignificante. |
|
|
|
|
#5 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Dal mero punto di vista delle performance un compilatore moderno dovrebbe produrre risultati migliori con la versione statica per le seguenti ragioni:
|
|
|
|
|
#6 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
perché mai non dotresti avere dei cache miss sugli accessi allo stack? é un discorso statistico? o é un discorso relativo ad architetture particolari che magari usano stack veloci? (comunque non é il caso degli x86 e credo nemmeno degli x64)
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
In C# sono piu' performanti le chiamate a funzioni di istanza piuttosto che quelle statiche.
Meglio, in C# compilato per x86 a 32bit. Una chiamata a procedura statica ha bisogno di 2 accessi in memoria per poter andare a prendere l'indirizzo finale, mentre una chiamata a procedura di istanza e' una jsr con spiazzamento. Pensavo fosse l'opposto ma me ne sono accorto durante uno dei contest. Non so invece relativamente ai dati.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
#8 | |
|
Member
Iscritto dal: Feb 2005
Messaggi: 127
|
Quote:
ok, grazie 1000
__________________
the AUSTRALOPITECI |
|
|
|
|
|
#9 | ||
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Quote:
Quote:
Ultima modifica di !k-0t1c! : 10-05-2009 alle 16:58. |
||
|
|
|
|
#10 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
come dire che un metodo con un parametro in meno é sicuramente piu performante. poi é chiaro che con l'hardware di oggi per riuscire a vedere una minima differenza di performance bisogna mettercela tutta. |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Feb 2005
Messaggi: 127
|
ciao, scusate ma non avevo letto le precedenti risposte..
usare la versione statica è dunque leggermente piu veloce?? ma questo solo in c# o anche in c++?
__________________
the AUSTRALOPITECI |
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Sinceramente mi sembrano "voli pindarici" (per non fare paragoni più grotteschi
)Allora che mi dite di quelle librerie dove TUTTI i metodi sono virtual? Secondo questi ragionamenti si dovrebbe distruggere completamente le performance... dato che a runtime si deve pure fare il lookup nella vtable. IMHO sottovalutate un pò i pc moderni |
|
|
|
|
#13 | |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Quote:
E comunque ripeto che salvo in contesti dove l'hardware è spinto ai veri limiti tutto questo discorso è una speculazione inutile. Se volete ricavare la una privata da una chiave pubblica o studiare i comportamenti dei buchi neri all'avvicinarsi l'uno all'altro serviranno questi ed altri accorgimenti per metterci meno dell'eternità a finire i calcoli |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Ho guardato proprio i disassemblati, e i benchmark hanno poi dato ragione. Quelle che erano classi statiche con metodi statici, una volta rese istanze e metodi d'istanza erano piu' performanti. E ovviamente sui contest ho poi agito cosi'. Anche a me sembrava PALESE il contrario prima di provarci.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#15 | |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Quote:
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Ho infatti iniziato la frase con "In C# ...", volendo portare piu' che altro un contributo per chiunque lo usi, piu' che altro per confronto con C++
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:17.











)








