static bool Generic<T1, T2>(T1 a, T2 b)
{
return (object)a == (object)b;
}
static bool Test()
{
return Generic(42, 3.14);
}
برنامج Codegen مقابل 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 المرجع
| - * LCL_VAR المرجع V03 tmp1
- * BOX المرجع
- * LCL_VAR المرجع V04 tmp2
Expected codegen:
```asm
; Method Program:Test():bool
xor eax, eax ; return false
ret
لست متأكدًا مما إذا كان الأشخاص يستخدمون هذا النمط بالفعل. ولكن يجب أن يكون حلًا بسيطًا لأن CoreCLR يعمل بالفعل على تحسين الملاكمة للحالات المماثلة (على سبيل المثال boxing(x) == null
إلى false
إلخ ، راجع https://github.com/mono/mono/issues/17858 للحصول على الروابط) .
الفئة: cq
الموضوع: التحسين
مستوى المهارة: متوسط
التكلفة: متوسطة
لست متأكدًا مما إذا كان الأشخاص يستخدمون هذا النمط بالفعل
لا فائدة من إضافة تحسينات للأنماط أكثر من عدم ظهورها مطلقًا في رمز العالم الحقيقي ...
jkotas لقد صنعت نموذجًا أوليًا سريعًا ووجدت فرق jit بضعة كيلو بايت فرق لـ BCL ، على سبيل المثال https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581
محدث: حسنًا ، يبدو أنه pmi
كان يجرعه ولن يحدث في العالم الحقيقي.
بالنظر إلى التوقع بأن هذا لا يحدث في رمز العالم الحقيقي ، سأغلق هذا حتى نرى مثالًا محفزًا في العالم الحقيقي.
التعليق الأكثر فائدة
jkotas لقد صنعت نموذجًا أوليًا سريعًا ووجدت فرق jit بضعة كيلو بايت فرق لـ BCL ، على سبيل المثال https://github.com/dotnet/corefx/blob/master/src/System.Data.Common/src/System/Data /RbTree.cs#L1581
محدث: حسنًا ، يبدو أنه
pmi
كان يجرعه ولن يحدث في العالم الحقيقي.