static bool Generic<T1, T2>(T1 a, T2 b)
{
return (object)a == (object)b;
}
static bool Test()
{
return Generic(42, 3.14);
}
Codegen por 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 int
+--* Ref. CUADRO
| --* LCL_VAR ref V03 tmp1
--* Ref. CAJA
--* LCL_VAR ref V04 tmp2
Expected codegen:
```asm
; Method Program:Test():bool
xor eax, eax ; return false
ret
Sin embargo, no estoy seguro de si la gente realmente usa este patrón. Pero debería ser una solución simple porque CoreCLR ya optimiza el boxeo para casos similares (por ejemplo boxing(x) == null
a false
, etc., consulte https://github.com/mono/mono/issues/17858 para ver los enlaces) .
categoría:cq
tema:optimización
nivel de habilidad:intermedio
costo: medio
Sin embargo, no estoy seguro de si la gente realmente usa este patrón.
No tiene sentido agregar optimizaciones para patrones que nunca aparecen en el código del mundo real...
@jkotas Hice un prototipo rápido y el jit-diff encontró una diferencia de algunos kb para BCL, por ejemplo, https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581
UPD: bueno, parece que pmi
lo estaba haciendo y no sucederá en el mundo real.
Dada la expectativa de que esto no ocurra en el código del mundo real, cerraré esto hasta que veamos un ejemplo motivador del mundo real.
Comentario más útil
@jkotas Hice un prototipo rápido y el jit-diff encontró una diferencia de algunos kb para BCL, por ejemplo, https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581
UPD: bueno, parece que
pmi
lo estaba haciendo y no sucederá en el mundo real.