Stavo curiosando in XNA e ho visto che la classe Vector3
conteneva campi pubblici anziché proprietà. Ho provato un rapido benchmark e ho scoperto che, per un struct
, la differenza è piuttosto drammatica (aggiungendo due Vettori insieme a 100 milioni di volte hanno preso 2.0s con proprietà e 1.4 secondi con campi). Per un tipo di riferimento, la differenza non sembra essere così grande ma è lì.Perché i campi pubblici sono più veloci delle proprietà?
Quindi, perché? So che una proprietà è compilata nei metodi get_X
e set_X
, che comporterebbero un overhead di chiamata del metodo. Tuttavia, questi semplici getter/setter sono sempre in linea con la JIT? So che non puoi garantire ciò che la JIT decide di fare, ma sicuramente questo è abbastanza alto nella lista delle probabilità? Cos'altro c'è che separa un campo pubblico da una proprietà a livello di macchina?
E una cosa che mi sono chiesto: come è una proprietà auto-implementata (public int Foo { get; set; }
) 'migliore' design OO di un campo pubblico? O meglio detto: come sono questi due diversi? So che renderlo una proprietà è più facile con la riflessione, ma qualcos'altro? Scommetto che la risposta ad entrambe le domande è la stessa cosa.
BTW: io sto usando .NET 3.5 SP1 che credo problemi risolti in cui i metodi con le strutture (o metodi di le strutture, non sono sicuro) non sono stati allineati in-, in modo che non è vero. Penso che lo sto usando almeno, è sicuramente installato, ma ripeto, sto usando Vista 64-bit con SP1 che dovrebbe avere DX10.1 tranne che non ho DX10.1 ..
Inoltre: sì, sono stato in esecuzione una build di rilascio :)
EDIT: apprezzo le risposte rapide ragazzi, ma ho indicato che ho faccio sanno che un accesso proprietà è una chiamata di metodo, ma che i don' so perché il metodo presumibilmente allineato è più lento di un accesso diretto al campo.
EDIT 2: Così ho creato un altro struct
che ha usato esplicitamente GetX() metodi (o come non mancano i miei giorni di Java affatto) e che ha effettuato lo stesso se ho disabilitato in-rivestimento su di esso (tramite [MethodImplAttribute(MethodImplOptions.NoInlining)]
) o no, quindi conclusione: i metodi non statici apparentemente non sono mai in linea, nemmeno sulle strutture.
Ho pensato che c'erano delle eccezioni, in cui la JIT poteva optare per il richiamo del metodo virtuale. Perché questo non può accadere su strutture che non conoscono alcuna eredità e quindi una chiamata al metodo può solo indicare un possibile metodo, giusto? O è perché è possibile implementare un'interfaccia su di esso?
Questa è una specie di peccato, dal momento che davvero mi fanno pensare di utilizzare le proprietà su roba critica prestazioni, ma utilizzando i campi mi fa sentire sporca e tanto vale scrivere quello che sto facendo in C.
EDIT 3: Ho trovato lo this post sullo stesso identico argomento. La sua conclusione finale è che la chiamata di proprietà è stata ottimizzata. Avrei anche potuto giurare di aver letto molte volte che le semplici proprietà getter/setter saranno allineate, nonostante sia callvirt
nell'IL. Quindi sto diventando pazzo?
EDIT 4: Reed Copsey ha postato la risposta in un commento qui sotto:
Re: Edit3 - vedi il mio commento aggiornamento: Credo che questo sia JIT x86 vs x64 problemi JIT. il JIT in x64 non è maturo. Mi aspetterei che la MS migliori rapidamente così come i sistemi a 64 bit stanno arrivando online ogni giorno. - Reed Copsey
E la mia risposta alla sua risposta:
Grazie, questa è la risposta! Ho provato a forzare una build x86 e tutti i metodi sono ugualmente veloci e molto più veloci di x64. Questo è molto scioccante per me, in realtà, non avevo idea di vivere nella fase della pietra sul mio sistema operativo a 64 bit. Includerò il tuo commento nella mia risposta in modo che risulti migliore. - JulianR
Grazie a tutti!
Domanda: cosa succede se il campo è pubblico ma c'è anche una proprietà. E 'quindi in linea? – Quibblesome
Non sembra, no. – JulianR
Re: Edit3 - vedere il mio commento aggiornato: credo che questo sia x86 JIT vs x64 problemi JIT. il JIT in x64 non è maturo. Mi aspetterei che la MS migliori rapidamente così come i sistemi a 64 bit stanno arrivando online ogni giorno. –