Por que os campos públicos são mais rápidos que as propriedades?

Eu estava bisbilhotando no XNA e vi que oVector3 classe @ estava usando campos públicos em vez de propriedades. Tentei uma referência rápida e descobri que, para umstruct a diferença é bastante dramática (adicionar dois vetores 100 milhões de vezes levou 2,0 segundos com propriedades e 1,4 segundos com campos). Para um tipo de referência, a diferença não parece ser tão grande, mas está lá.

Então, por que é isso? Eu sei que uma propriedade é compilada emget_X eset_X métodos, o que implicaria uma sobrecarga de chamada de método. No entanto, esses getters / setters simples nsempr ficar alinhado com o JIT? Eu sei que você não pode garantir o que o JIT decide fazer, mas certamente isso é bastante alto na lista de probabilidades? O que mais existe que separa um campo público de uma propriedade no nível da máquina?

E uma coisa que eu estive pensando: como é uma propriedade implementada automaticamente public int Foo { get; set; }) 'melhor' projeto OO do que um campo público? Ou melhor: como estão esses doisdiferent? Eu sei que torná-lo uma propriedade é mais fácil com a reflexão, mas mais alguma coisa? Aposto que a resposta para as duas perguntas é a mesma cois

BTT: Estou usando o .NET 3.5 SP1, que acredito ter corrigido problemas em que métodos com estruturas (ou métodosd structs, não tenho certeza) não estavam alinhados, então não é isso. Acho que estou usando pelo menos, ele certamente está instalado, mas, novamente, estou usando o Vista de 64 bits com SP1, que deve ter o DX10.1, exceto que eu não tenho o DX10.

Also: sim, eu tenho executado uma versão compilada

EDITA: Eu aprecio as respostas rápidas, pessoal, mas eu indiquei que euFa sei que um acesso à propriedade é uma chamada de método, mas não sei por que o método presumivelmente alinhado é mais lento que um acesso direto ao camp

EDIT 2: Então eu criei outrostruct que usava métodos GetX () explícitos (como não sinto falta dos meus dias em Javaem absolut) e executou o mesmo, independentemente de eu ter desativado o alinhamento (através de[MethodImplAttribute(MethodImplOptions.NoInlining)]) ou não, então conclusão: métodos não estáticos aparentemente nunca são incorporados, nem mesmo em estrutura

Eu pensei que havia exceções, nas quais o JIT poderia otimizar a chamada de método virtual. Por que isso não pode acontecer em estruturas que não conhecem herança e, portanto, uma chamada de método pode apontar apenas para um método possível, certo? Ou é porque você pode implementar uma interface nele?

Isso é uma pena, uma vez que realmente me faz pensar em usar propriedades em itens críticos de desempenho, mas o uso de campos me faz sentir suja e eu também posso escrever o que estou fazendo em C.

EDIT 3: Eu encontreiist postando exatamente o mesmo assunto. Sua conclusão final é que a chamada de propriedade foi otimizada. Eu também poderia jurar que li várias vezes que propriedades simples de getter / setter ficam alinhadas, apesar de seremcallvirt na IL. Então, eu estou ficando louco?

EDIT 4: Reed Copsey postou a resposta em um comentário abaixo:

Re: Edit3 - veja meu comentário atualizado: Eu acredito que este é x86 JIT vs x64 JIT questões. o JIT em x64 não é tão maduro. Eu esperaria que a MS melhorasse isso rapidamente à medida que mais sistemas de 64 bits estivessem online todos os dias. - Reed Copsey

E a minha resposta à sua resposta:

Obrigado, esta é a resposta! Tentei forçar uma compilação x86 e todos os métodos são igualmente rápidos e muito mais rápidos que o x64. Isso é muito chocante para mim, na verdade, eu não tinha ideia de que estava vivendo na idade da pedra no meu sistema operacional de 64 bits. Incluirei seu comentário na minha resposta para que se destaque melhor. - JulianR

brigado a todo

questionAnswers(5)

yourAnswerToTheQuestion