Torna indietro   Hardware Upgrade Forum > Software > Programmazione

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
Cos'è la bolla dell'IA e perché se ne parla
Cos'è la bolla dell'IA e perché se ne parla
Si parla molto ultimamente di "bolla dell'intelligenza artificiale", ma non è sempre chiaro perché: l'IA è una tecnologia molto promettente e che ha già cambiato molte cose dentro e fuori le aziende, ma ci sono enormi aspettative che stanno gonfiando a dismisura i valori delle azioni e distorcendo il mercato. Il che, com'è facile intuire, può portare a una ripetizione della "bolla dotcom", e forse anche di quella dei mutui subprime. Vediamo perché
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-09-2010, 11:55   #1
Lim
Senior Member
 
L'Avatar di Lim
 
Iscritto dal: Dec 2000
Messaggi: 501
[Programmazione] Tempo di accesso alle variabili

Una buona consuetudine della programmazione ad oggetti consiglia di non rendere public le variabili di un oggetto, ma private e di accedervi tramite i metodi get()

Mi stavo chiedendo, ma il tempo di accesso nei due casi è lo stesso? (ne dubito)
Ragionando in termini di ottimizzazione del codice, conviene accedere direttamente alle variabili senza invocare un metodo aggiuntivo?

Esempio:
Codice:
Assumiamo che un Oggetto abbia le variabili x ed y:

public int x;
public int y;

Per accedervi posso fare: 
Oggetto.x;
Oggetto.y;

Se fossero private:
private int x;
private int y;

allora dovrei invocarle in quest'altro modo:
Oggetto.getX();
Oggetto.getY();

Supponiamo ancora di dovervi accedere migliaia di volte, sarebbero migliaia di chiamate a getX e getY, converrebbe bypassare queste chiamate al costo di una visibilità pubblica delle variabili in questione?
Lim è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2010, 12:31   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Lim Guarda i messaggi
...
Supponiamo ancora di dovervi accedere migliaia di volte, sarebbero migliaia di chiamate a getX e getY, converrebbe bypassare queste chiamate al costo di una visibilità pubblica delle variabili in questione?
So che programmi in Java, e relativamente a questo contesto tieni presente che le JVM moderne supportano la just-in-time compilation e quando, a runtime, un metodo viene invocato 1000 volte (di default, il parametro è personalizzabile) il codice viene compilato in forma nativa, per velocizzarne l'esecuzione.

In generale, che ci sia un "overhead" tra l'accesso diretto ad un membro di una istanza rispetto al'invocazione di un metodo, immagino di sì.
Sempre in generale, credo però non sia poi così rilevante.

Ma a meno di milioni (o forse centinaia di milioni, non certo migliaia) di invocazioni non credo la questione sia rilevante.
Se lo è e rappresenta il "collo di bottiglia" più rilevante tra quelli eventualmente presenti nell'applicazione (e per capirlo bisogna analizzare l'applicazione a runtime con un profiler) allora forse devi scegliere uno strumento più adatto (linguaggio di programmazione + sua implementazione) rispetto al contesto in cui lavori...
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 29-09-2010 alle 12:34.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2010, 12:57   #3
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da Lim Guarda i messaggi
Una buona consuetudine della programmazione ad oggetti consiglia di non rendere public le variabili di un oggetto, ma private e di accedervi tramite i metodi get()
...

Supponiamo ancora di dovervi accedere migliaia di volte, sarebbero migliaia di chiamate a getX e getY, converrebbe bypassare queste chiamate al costo di una visibilità pubblica delle variabili in questione?
I moderni compilatori si accorgono dell'uso di getter/setter sostituiscono direttamente il codice, pertanto non vedresti alcuna differenza di prestazioni.

E' diverso per compilatori piu' datati. Se per esempio in C non vuoi accedere direttamente ad una variabile globale ma proteggerla attraverso get/set, vedresti la differenza.
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2010, 13:09   #4
Lim
Senior Member
 
L'Avatar di Lim
 
Iscritto dal: Dec 2000
Messaggi: 501
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
So che programmi in Java, e relativamente a questo contesto tieni presente che le JVM moderne supportano la just-in-time compilation e quando, a runtime, un metodo viene invocato 1000 volte (di default, il parametro è personalizzabile) il codice viene compilato in forma nativa, per velocizzarne l'esecuzione.

In generale, che ci sia un "overhead" tra l'accesso diretto ad un membro di una istanza rispetto al'invocazione di un metodo, immagino di sì.
Sempre in generale, credo però non sia poi così rilevante.

Ma a meno di milioni (o forse centinaia di milioni, non certo migliaia) di invocazioni non credo la questione sia rilevante.
Se lo è e rappresenta il "collo di bottiglia" più rilevante tra quelli eventualmente presenti nell'applicazione (e per capirlo bisogna analizzare l'applicazione a runtime con un profiler) allora forse devi scegliere uno strumento più adatto (linguaggio di programmazione + sua implementazione) rispetto al contesto in cui lavori...
Mi è venuto questo dubbio proprio perchè il profiler mi ha evidenziato un elevato numero di chiamate a specifici metodi get...

Comunque, stando a quanto dice Sottovento, posso lasciare tutto così com'è, penso che possa essere considerato un compilatore moderno il Java...
Lim è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2010, 14:02   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Lim Guarda i messaggi
Mi è venuto questo dubbio proprio perchè il profiler mi ha evidenziato un elevato numero di chiamate a specifici metodi get...

Comunque, stando a quanto dice Sottovento, posso lasciare tutto così com'è, penso che possa essere considerato un compilatore moderno il Java...
Quello che dice sottovento è senz'altro valido, ma tu resti comunque nell'ambito della tecnologia Java.

Il che significa che quello che javac (il compilatore) produce è bytecode.
Francamente non so se un setter "liscio" (cioè che nel corpo del metodo non fa altro che accedere al campo e basta) venga già tradotto a livello di bytecode come un accesso diretto al campo (perchè appunto il setter potrebbe anche fare altro) .
Immagino (e spero sinceramente) di sì, ma si fa presto a fare una prova e guardare il bytecode prodotto per togliersi il dubbio
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2010, 14:31   #6
Torav
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 558
Ma non si possono dare delle istruzioni per rendere inline le funzioni? Con gcc si può abbastanza facilmente e i getter e setter vengono sosituiti direttamente.
Torav è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2010, 14:50   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Torav Guarda i messaggi
Ma non si possono dare delle istruzioni per rendere inline le funzioni? Con gcc si può abbastanza facilmente e i getter e setter vengono sosituiti direttamente.
Non ce n'è bisogno: queste ottimizzazioni le fa la JVM, non il compilatore.
Ripeto: chi programma in un linguaggio che verrà tradotto da un compilatore in bytecode compatibile con la JVM non ha/ non deve (nel 95% dei casi?) preoccuparsi di questi aspetti.

Proprio perchè eventuali ottimizzazioni sono "spostate più in là" nella JVM a tempo di esecuzione (in questo modo si riescono a fare ottimizzazioni altrimenti impossibili a tempo di compilazione).

Poi magari ci sta che il compilatore specifico per il dato linguaggio (javac per Java, scalac per Scala, ecc...) sia abbastanza "smart" da ottimizzare certe casistiche (e qui conta quanto è avanzato il compilatore e le peculiarità del linguaggio; andando a naso direi che javac è bello maturo e dunque posso aspettarmi che sia più "smart" di altri compilatori più giovani).

Però non ho mai approfondito questi aspetti, dunque non so dare una risposta esauriente.

EDIT
@Lim: se vuoi sviscerare la questione ti consiglierei di consultare risorse "più specializzate", tipo i Java Technology Forums.
Comunque [sempre a naso] direri che per le ottimizzazioni in generale c'entra sia il compilatore (per via delle ottimizzazioni "statiche") che la JVM (e qui bisognerebbe anche conoscere quali opzioni si possono passare, già tra JVM -client e -server ci sono delle differenze).

A questo link c'è una discussione recente (2009) in merito, pescata a caso dal web.
Dalla quale mi permetto di quotare una considerazione in particolare, che sposo completamente:
Quote:
Given the infinitesimal advantage of direct calls, it seems you could focus
your optimization efforts elsewhere to much more advantage. I have always
found that a solid design is much more effective at achieving high
performance than speculative optimization. The exception to this rule would
be if profiling revealed that you were spending an inordinate amount of time
calling getters.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 29-09-2010 alle 15:02.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2010, 15:34   #8
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Permettimi un'ulteriore riflessione.

Supponiamo che profilando l'applicazione scopri che hai un esagerazione di chiamate al metodo getQualcosa() di una tua (user-defined) classe.

Supponiamo anche che la cosa sia giustificata da un punto di vista logico: la tua classe in questione è una classe Punto che per esempio definisce un punto in un sistema di coordinate 3D e hai un motore che si mangia tonnellate di istanze di questa classe per leggerne (per esempio) le coordinate (getX(), getY(), getZ()) e fare qualcosa

Posto che la quantità industriale di accessi ai campi non è dovuto ad un problema di design, supponiamo che la classe sia immutabile: cioè lo stato di un Punto, una volta istanziato, non può essere modificato.

In questo caso è lecito supporre che le tre variabili che rappresentano il valore delle 3 coordinate siano dichiarate come final; a questo punto non è neccessario realizzare l'incapsulamento dello stato mettendo a disposizione i getter (i setter non ci saranno neppure, dato che l'oggetto è immutabile).

Avrai una cosa del genere:
Codice:
public class Punto {
    public final int x, y, z;

    public Punto(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}
In questo caso definire una visibilità pubblica dello stato dell'oggetto, in quanto immutabile, non comporta problemi (ci sarebbero delle considerazioni circa il codice cliente che accede direttamente ai campi invece che indirettamente, tramite un metodo, ma sono questioni suppongo di minimo o nullo interesse nel tuo contesto)
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 29-09-2010 alle 15:39.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2010, 15:41   #9
Lim
Senior Member
 
L'Avatar di Lim
 
Iscritto dal: Dec 2000
Messaggi: 501
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Permettimi un'ulteriore riflessione.

Supponiamo che profilando l'applicazione scopri che hai un esagerazione di chiamate al metodo getQualcosa() di una tua (user-defined) classe.

Supponiamo anche che la cosa sia giustificata da un punto di vista logico: la tua classe in questione è una classe Punto che per esempio definisce un punto in un sistema di coordinate 3D e hai un motore che si mangia tonnellate di istanze di questa classe per leggerne (per esempio) le coordinate (getX(), getY(), getZ()) e fare qualcosa

Posto che la quantità industriale di accessi ai campi non è dovuto ad un problema di design, supponiamo che la classe sia immutabile: cioè lo stato di un Punto, una volta istanziato, non può essere modificato.

In questo caso è lecito supporre che le tre variabili che rappresentano il valore delle 3 coordinate siano dichiarate come final; a questo punto non è neccessario realizzare l'incapsulamento dello stato mettendo a disposizione i getter (i setter non ci saranno neppure, dato che l'oggetto è immutabile).

Avrai una cosa del genere:
Codice:
public class Punto {
    public final int x, y, z;

    public Punto(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}
Ed è lecito scegliere di avere una visibilità pubblica dello stato dell'oggetto, in quanto immutabile.

Con il tuo esempio non ci sei andato lontano!
Ho proprio una quantità industriale di "punti" da spostare, quindi ad ogni step temporale devo leggerne il centro (x,y,z) e le componenti della velocità (vx,vy,vz).
Purtroppo cambiano ad ogni step, quindi non posso dichiararle final ed i miei metodi get() mi restituiscono l'array di dim 3...

Ho fatto questa domanda proprio perchè il profiler mi evidenzia queste chiamate come quelle più esose in termini di selfTime e selfTime(CPU). Sto usando VisualVM...
Lim è offline   Rispondi citando il messaggio o parte di esso
Old 29-09-2010, 16:12   #10
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Lim Guarda i messaggi
Con il tuo esempio non ci sei andato lontano!
Ho proprio una quantità industriale di "punti" da spostare, quindi ad ogni step temporale devo leggerne il centro (x,y,z) e le componenti della velocità (vx,vy,vz).
Purtroppo cambiano ad ogni step, quindi non posso dichiararle final ed i miei metodi get() mi restituiscono l'array di dim 3...

Ho fatto questa domanda proprio perchè il profiler mi evidenzia queste chiamate come quelle più esose in termini di selfTime e selfTime(CPU). Sto usando VisualVM...
Richiesta:

-> Puoi descrivere il tuo sistema e le relazioni tra le entità coinvolte in modo schematico e conciso, individuando bene ogni entità con un nome (a cui dopo, nel proseguio del thread, ci si possa riferire senza ambiguità) e le operazioni che compie? (so che lo hai già fatto in un altro thread, ma è meglio se rendi la cosa in modo schematico). Magari delineando bene come evolve il sistema nel tempo.

Il motivo della richiesta sta nel fatto che io ricordo vagamente il comportmento della tua applicazione e mi pare di capire che tu stia cercando di eseguire delle ottimizzazioni di "grana fine" perchè stai sviluppando una simulazione la cui bontà/validità è direttamente legata a parametri quantitativi che a loro volta implicano il consumo risorse macchina di grandezza proporzionale al numero delle entità simulate istanziate a runtime.

Per darti un consiglio efficace dunque (e io non sono sicuro di potertene dare uno, in tal senso) è neccessario avere un'idea precisa della composizione e del funzionamento del sistema, oltre che del fattore con cui consuma risorse macchina attualmente.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


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 ...
FRITZ!Repeater 1700 estende la rete super-veloce Wi-Fi 7 FRITZ!Repeater 1700 estende la rete super-veloce...
Apple 'apre' iOS alle terze parti anche ...
Cloud sovrano: l'approccio di Broadcom c...
HONOR conferma l'arrivo in Italia di Mag...
La Cina sotto pressione impone maniglie ...
OpenAI integra le app in ChatGPT per tra...
NVIDIA sarebbe pronta a tagliare la prod...
Prezzo minimo storico per iPhone 16 Pro:...
Riot Games scopre una falla nei BIOS che...
Beats in super offerta su Amazon: aurico...
Batterie elettriche, Samsung SDI e Stell...
Clivet presenta Fullness, la pompa di ca...
SpaceX lancerà 167 razzi spaziali...
Yakuza Kiwami 3 e Dark Ties protagonisti...
Privacy a rischio: ecco la VPN che regis...
SpaceX ha annunciato che un satellite St...
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: 09:05.


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