static bool Generic<T1, T2>(T1 a, T2 b)
{
return (object)a == (object)b;
}
static bool Test()
{
return Generic(42, 3.14);
}
Codegen pour Test
:
; Method Program:Test():bool
G_M11853_IG01:
push rsi
sub rsp, 32
vzeroupper
G_M11853_IG02:
mov rcx, 0xD1FFAB1E
call CORINFO_HELP_NEWSFAST
mov rsi, rax
mov dword ptr [rsi+8], 42
mov rcx, 0xD1FFAB1E
call CORINFO_HELP_NEWSFAST
vmovsd xmm0, qword ptr [reloc @RWD00]
vmovsd qword ptr [rax+8], xmm0
cmp rsi, rax
sete al
movzx rax, al
G_M11853_IG03:
add rsp, 32
pop rsi
ret
RWD00 dq 40091EB851EB851Fh
```
--* EQ\NE entier
+--* Réf COFFRET
| --* LCL_VAR réf V03 tmp1
--* Réf COFFRET
--* LCL_VAR réf V04 tmp2
Expected codegen:
```asm
; Method Program:Test():bool
xor eax, eax ; return false
ret
Je ne sais pas si les gens utilisent réellement ce modèle. Mais devrait être une solution simple car CoreCLR optimise déjà la boxe pour des cas similaires (par exemple boxing(x) == null
à false
etc, voir https://github.com/mono/mono/issues/17858 pour les liens) .
catégorie:cq
thème:optimisation
niveau de compétence : intermédiaire
coût :moyen
Je ne sais pas si les gens utilisent réellement ce modèle
Il ne sert à rien d'ajouter des optimisations pour des modèles qui n'apparaissent jamais dans le code du monde réel...
@jkotas J'ai fait un prototype rapide et le jit-diff a trouvé quelques ko de diff pour BCL, par exemple https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581
UPD : eh bien, il semblerait que pmi
le dope et n'arrivera pas dans le monde réel.
Étant donné que l'on s'attend à ce que cela ne se produise pas dans le code du monde réel, je vais fermer ceci jusqu'à ce que nous voyions un exemple motivant du monde réel.
Commentaire le plus utile
@jkotas J'ai fait un prototype rapide et le jit-diff a trouvé quelques ko de diff pour BCL, par exemple https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581
UPD : eh bien, il semblerait que
pmi
le dope et n'arrivera pas dans le monde réel.