static bool Generic<T1, T2>(T1 a, T2 b)
{
return (object)a == (object)b;
}
static bool Test()
{
return Generic(42, 3.14);
}
Codegen für 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
+--* BOX-Ref
| --* LCL_VAR ref V03 tmp1
--* BOX-Ref
--* LCL_VAR ref V04 tmp2
Expected codegen:
```asm
; Method Program:Test():bool
xor eax, eax ; return false
ret
Ich bin mir jedoch nicht sicher, ob die Leute dieses Muster tatsächlich verwenden. Sollte aber eine einfache Lösung sein, da CoreCLR das Boxen bereits für ähnliche Fälle optimiert (z. B. boxing(x) == null
bis false
usw., siehe https://github.com/mono/mono/issues/17858 für Links). .
Kategorie:cq
Thema: Optimierung
Schwierigkeitsgrad : Mittelstufe
Kosten: mittel
Ich bin mir jedoch nicht sicher, ob die Leute dieses Muster tatsächlich verwenden
Es hat keinen Sinn, Optimierungen für Muster hinzuzufügen, die niemals im Code der realen Welt auftauchen....
@jkotas Ich habe einen schnellen Prototyp erstellt und der Jit-Diff hat ein paar kb Diff für BCL gefunden, zB https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581
UPD: Nun, es scheint, dass pmi
es dosiert hat und in der realen Welt nicht passieren wird.
Angesichts der Erwartung, dass dies im realen Code nicht vorkommt, werde ich dies schließen, bis wir ein motivierendes Beispiel aus der realen Welt sehen.
Hilfreichster Kommentar
@jkotas Ich habe einen schnellen Prototyp erstellt und der Jit-Diff hat ein paar kb Diff für BCL gefunden, zB https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581
UPD: Nun, es scheint, dass
pmi
es dosiert hat und in der realen Welt nicht passieren wird.