Fabienã¯æè¿ãå°ããªã¬ã€ãã¬ãŒãµãŒã解èªã ãã³ãŒãã®é£èªåã解ããæ°åŠãçŽ æŽãããçŸãã説æããçŽ æŽãããæçš¿ãæžããŸããã æéããããŠãããèªãããšããå§ãããŸãïŒ
ãããã ãã®C ++ã³ãŒããCïŒã«ç§»æ€ããããšã¯å¯èœãã©ããçåã«æããŸããã æè¿ã ã¡ã€ã³ã®ä»äºã§ããããã®C ++ãæžããªããã°ãªããªãã£ãã®ã§ãè©ŠããŠã¿ãããšæããŸããã
ãããããã£ãšéèŠãªã®ã¯ãCïŒãäœã¬ãã«èšèªã§ãããã©ãããããããç¥ããããšæã£ãããšã§ãã
å°ãç°ãªããŸãããé¢é£ãã質åïŒCïŒã¯ãã·ã¹ãã ããã°ã©ãã³ã°ãã«ã©ããããé©ããŠããŸããïŒ ãã®ä»¶ã«é¢ããŠã 2013幎ã®Joe Duffyã®çŽ æŽãããæçš¿ããå§ãããŸãã
ã©ã€ã³ããŒã
ãŸããé£èªå解é€ãããC ++ã³ãŒãã1è¡ã〠CïŒã«ç§»æ€ããããšããå§ããŸããã ããã¯éåžžã«ç°¡åã§ããïŒçå®ã¯ãŸã CïŒãC ++++ã§ãããšèšãããŠããããã§ãïŒ
ãã®äŸã¯ãäž»ãªããŒã¿æ§é ã瀺ããŠããŸã-'ãã¯ã¿ãŒ'ãããã¯æ¯èŒã§ããå·ŠåŽã«C ++ãå³åŽã«CïŒããããŸãã

ãã®ãããããã€ãã®æ§æäžã®éãããããŸããã.NETã§ã¯ç¬èªã®å€åãå®çŸ©ã§ãããããåãæ©èœãåŸãããšãã§ããŸããã ããã¯éèŠã§ããããã¯ã¿ãŒããæ§é ãšããŠæ±ããšãããè¯ããããŒã¿ã®å±ææ§ããåŸãããšãã§ããããŒã¿ãã¹ã¿ãã¯ã«ããã·ã¥ãããããã.NETã¬ããŒãžã³ã¬ã¯ã¿ãŒãé¢äžãããå¿ èŠããªãããã§ãïŒã¯ããããã¯å®è£ ã®è©³çŽ°ã§ãïŒã
.NETã®
structs
ãŸãã¯ãå€åãã®è©³çŽ°ã«ã€ããŠã¯ã次ãåç §ããŠãã ããã
- ããŒããšã¹ã¿ãã¯ãå€åãšåç §å
- å€åãšåç §å
- .NETã®ã¡ã¢ãªïŒã©ããž
- å€åã«é¢ããçå®
- ã¹ã¿ãã¯ã¯å®è£ ã®è©³çŽ°ãããŒã1
ç¹ã«ãEric Lippertã®æåŸã®æçš¿ã§ã¯ããå€åããå®éã«äœã§ããããæ確ã«ããæçšãªåŒçšãèŠã€ããŸããã
ãã¡ãããå€ã®ã¿ã€ãã«é¢ããæãéèŠãªäºå®ã¯ãå®è£ ã®è©³çŽ°ã ããããã©ã®ããã«åºå¥ããããã§ã¯ãªãã ãå€ã®ã¿ã€ããã®æ¬æ¥ã®æå³çãªæå³ ã ã€ãŸãåžžã«ãå€ã«ãã£ãŠãã³ããŒãããããšã§ã ã å²ãåœãŠæ å ±ãéèŠãªå ŽåãããŒãã¿ã€ãããã³ã¹ã¿ãã¯ã¿ã€ããšåŒã³ãŸãã ããããã»ãšãã©ã®å Žåãããã¯éèŠã§ã¯ãããŸããã ã»ãšãã©ã®å Žåãã³ããŒãšèå¥ã®ã»ãã³ãã£ã¯ã¹ã¯é¢é£ããŠããŸãã
次ã«ãä»ã®ã¡ãœãããã©ã®ããã«æ¯èŒãããããèŠãŠã¿ãŸãããïŒå·ŠåŽãC ++ãå³åŽãCïŒ
RayTracing(..)
æåã«
RayTracing(..)
ãŸãã

ãã®åŸã
QueryDatabase (..)
ïŒ

ïŒããã2ã€ã®æ©èœã®æ©èœã®èª¬æã«ã€ããŠã¯ã Fabianã®æçš¿ãåç §ããŠãã ããïŒ
ãã ããå®éã«ã¯ãCïŒã䜿çšãããšãC ++ã³ãŒããéåžžã«ç°¡åã«äœæã§ããŸãã ãã®å Žåã
ref
ããŒã¯ãŒããæã圹ç«ã¡ãŸããããã«ãããåç §ã«ãã£ãŠå€ãæž¡ãããšãã§ããŸã ã ããªã以åããã¡ãœããåŒã³åºãã§
ref
ã䜿çšããŠããŸããããæè¿ãä»ã®å Žæã§
ref
ã解決ããåªåããªãããŠããŸãã
æ§é ãã³ããŒããå¿ èŠããªãããã
ref
ã䜿çšãããšããã©ãŒãã³ã¹ãåäžããå ŽåããããŸãã詳现ã«ã€ããŠã¯ãAdam Stinixã«ããæçš¿ã®ãã³ãããŒã¯ãšãPerformance Traps ref locals and ref return in CïŒããåç §ããŠãã ããã
ããããæãéèŠãªããšã¯ããã®ãããªã¹ã¯ãªãããCïŒããŒãã«C ++ãœãŒã¹ã³ãŒããšåãåäœãæäŸããããšã§ãã ããããã管çãªã³ã¯ãã¯ããã€ã³ã¿ãŒããšãŸã£ããåãã§ã¯ãªãããšã«æ³šæããŠãã ãããç¹ã«ããããã«å¯ŸããŠç®è¡æŒç®ãå®è¡ããããšã¯ã§ããŸããã詳现ã«ã€ããŠã¯ã以äžãåç §ããŠãã ããã
- ref returnã¯ãã€ã³ã¿ã§ã¯ãããŸãã
- ãããŒãžããã€ã³ã¿ãŒ
- ãªã³ã¯ã¯ã¢ãã¬ã¹ã§ã¯ãããŸãã
æ§èœ
ãããã£ãŠãã³ãŒãã¯ããŸã移æ€ãããŸããããããã©ãŒãã³ã¹ãéèŠã§ãã ç¹ã«ã¬ã€ãã¬ãŒãµãŒã§ã¯ãæ°åéãã¬ãŒã ãèšç®ã§ããŸãã C ++ã³ãŒãã«ã¯ã
sampleCount = 2
次ã®ããã«ãæçµçãªç»åå質ãå¶åŸ¡ããå€æ°
sampleCount
ãå«ãŸããŠããŸãã

æããã«ããŸãçŸå®çã§ã¯ãããŸããïŒ
ãããã
sampleCount = 2048
å°éãããšããã¹ãŠãããè¯ãèŠããŸãïŒ

ãã ãã
sampleCount = 2048
ããéå§ããã®ã¯éåžžã«æéãããããããå°ãªããšã1åéãæºããããã«ãä»ã®ãã¹ãŠã®å®è¡ã¯å€
2
ã§å®è¡ãããŸãã
sampleCount
å€æŽã¯ãæãå€åŽã®ã³ãŒãã«ãŒãã®å埩åæ°ã«ã®ã¿åœ±é¿ããŸãã説æã«ã€ããŠã¯ã ãã®èŠç¹ãåç §ããŠãã ããã
ãåçŽãªãåç·ããŒãåŸã®çµæ
C ++ãšCïŒãå®è³ªçã«æ¯èŒããããã«ã time-windowsããŒã«ã䜿çšããŸãããããã¯
time
unixã³ãã³ãã®ç§»æ€ã§ãã æåã®çµæã¯æ¬¡ã®ããã«ãªããŸããã
C ++ïŒVS 2017ïŒ | .NET FrameworkïŒ4.7.2ïŒ | .NET CoreïŒ2.2ïŒ | |
---|---|---|---|
æéïŒç§ïŒ | 47.40 | 80.14 | 78.02 |
ã³ã¢å ïŒç§ïŒ | 0.14ïŒ0.3ïŒ ïŒ | 0.72ïŒ0.9ïŒ ïŒ | 0.63ïŒ0.8ïŒ ïŒ |
ãŠãŒã¶ãŒç©ºéå ïŒç§ïŒ | 43.86ïŒ92.5ïŒ ïŒ | 73.06ïŒ91.2ïŒ ïŒ | 70.66ïŒ90.6ïŒ ïŒ |
ããŒãžãã©ãŒã«ããšã©ãŒã®æ° | 1143 | 4818 | 5945 |
ã¯ãŒã¯ã»ããïŒKBïŒ | 4232 | 13 624 | 17 052 |
æŒãåºãã¡ã¢ãªïŒKBïŒ | 95 | 172 | 154 |
éããªãšã³ããã£ãã¡ã¢ãª | 7 | 14 | 16 |
ã¹ã¯ãããã¡ã€ã«ïŒKBïŒ | 1460 | 10 936 | 11 024 |
æåã¯ãCïŒã³ãŒãã¯C ++ããŒãžã§ã³ããããããã«é ãããšãããããŸãããæ¹åãããŠããŸãïŒä»¥äžãåç §ïŒã
ããããæåã«ããã®ãåçŽãªãè¡ããšã®ããŒãã䜿çšããŠãã.NET JITãäœãããããèŠãŠã¿ãŸãããã ãŸããå°ããªãã«ããŒã¡ãœãããåã蟌ãã®ã«é©ããŠããŸãã ããã¯ãåªããã€ã³ã©ã€ã³ã¢ãã©ã€ã¶ãŒããŒã«ã®åºåã§ç¢ºèªã§ããŸãïŒç·è²=çµã¿èŸŒã¿ïŒã

ãã ãããã¹ãŠã®ã¡ãœãããåã蟌ãŸããããã§ã¯ãããŸãããããšãã°ãè€éãã®ããã«ã
QueryDatabase(..)
ã¹ããããããŸãã

.NET Just-In-TimeïŒJITïŒã³ã³ãã€ã©ã®ãã1ã€ã®æ©èœã¯ãç¹å®ã®ã¡ãœããåŒã³åºãã察å¿ããCPUåœä»€ã«å€æããããšã§ãã ããã¯
sqrt
ã·ã§ã«é¢æ°ã§å®éã«åäœããŠããããšãããããŸããCïŒãœãŒã¹ã³ãŒãã次ã«
Math.Sqrt
ãŸãïŒ
Math.Sqrt
åŒã³åºãã«æ³šæããŠ
Math.Sqrt
ïŒã
// intnv square root public static Vec operator !(Vec q) { return q * (1.0f / (float)Math.Sqrt(q % q)); }
.NET JITãçæããã¢ã»ã³ãã©ã³ãŒãã次ã«ç€ºããŸã
Math.Sqrt
ã®åŒã³åºãã¯ãªããããã»ããµåœä»€vsqrtsdã䜿çšãããŸãã
; Assembly listing for method Program:sqrtf(float):float ; Emitting BLENDED_CODE for X64 CPU with AVX - Windows ; Tier-1 compilation ; optimized code ; rsp based frame ; partially interruptible ; Final local variable assignments ; ; V00 arg0 [V00,T00] ( 3, 3 ) float -> mm0 ;# V01 OutArgs [V01 ] ( 1, 1 ) lclBlk ( 0) [rsp+0x00] "OutgoingArgSpace" ; ; Lcl frame size = 0 G_M8216_IG01: vzeroupper G_M8216_IG02: vcvtss2sd xmm0, xmm0 vsqrtsd xmm0, xmm0 vcvtsd2ss xmm0, xmm0 G_M8216_IG03: ret ; Total bytes of code 16, prolog size 3 for method Program:sqrtf(float):float ; ============================================================
ïŒãã®åé¡ãååŸããã«ã¯ã ãããã®æ瀺ã«åŸã ã ãDisasmoãVS2019ã¢ããªã³ã䜿çšãããã SharpLab.ioãã芧ãã ãã ïŒ
ãããã®çœ®æã¯çµã¿èŸŒã¿é¢æ°ãšãåŒã°ãã以äžã®ã³ãŒãã§JITãããããçæããæ¹æ³ã確èªã§ããŸãã ãã®ã¹ããããã¯ã
AMD64
ã®ã¿ã®ãããã³ã°ã瀺ããŠããŸãããJITã¯
X86
ã
ARM
ããã³
ARM64
ã察象ãšããŠããŸã ãå®å šãªæ¹æ³ã¯ãã¡ãã§ãã
bool Compiler::IsTargetIntrinsic(CorInfoIntrinsics intrinsicId) { #if defined(_TARGET_AMD64_) || (defined(_TARGET_X86_) && !defined(LEGACY_BACKEND)) switch (intrinsicId) { // AMD64/x86 has SSE2 instructions to directly compute sqrt/abs and SSE4.1 // instructions to directly compute round/ceiling/floor. // // TODO: Because the x86 backend only targets SSE for floating-point code, // it does not treat Sine, Cosine, or Round as intrinsics (JIT32 // implemented those intrinsics as x87 instructions). If this poses // a CQ problem, it may be necessary to change the implementation of // the helper calls to decrease call overhead or switch back to the // x87 instructions. This is tracked by #7097. case CORINFO_INTRINSIC_Sqrt: case CORINFO_INTRINSIC_Abs: return true; case CORINFO_INTRINSIC_Round: case CORINFO_INTRINSIC_Ceiling: case CORINFO_INTRINSIC_Floor: return compSupports(InstructionSet_SSE41); default: return false; } ... }
ã芧ã®ããã«ãäžéšã®ã¡ãœããã¯
Sqrt
ã
Abs
ãªã©å®è£ ãããŠãããä»ã®ã¡ãœããã¯C ++ã©ã³ã¿ã€ã é¢æ°ãããšãã°powfã䜿çšããŠããŸãã
ããã»ã¹å šäœã¯ã ãMath.PowïŒïŒã.NET Frameworkã«ã©ã®ããã«å®è£ ãããŠãããããšããèšäºã§éåžžã«ãã説æãããŠããŸããCoreCLRã®ãœãŒã¹ã§ãèŠãããšãã§ããŸãã
-
COMSingle::Pow
ã®å®è£ ãCOMSingle::Pow
ãCïŒã³ãŒãããMathF.Pow(..)
ãåŒã³åºãå Žåã«å®è¡ãããã¡ãœãã
- Cã©ã³ã¿ã€ã ã¡ãœããã®å®è£
ã§ã®ãããã³ã°
- OSéã§åãåäœãæäŸããã¯ãã¹ãã©ãããã©ãŒã ããŒãžã§ã³ã®powfå®è£
åçŽãªããã©ãŒãã³ã¹æ¹ååŸã®çµæ
çŽ æŽãªã©ã€ã³ããšã®ããŒããããã«æ¹åã§ãããã©ããçåã«æããŸãã ãããã¡ã€ãªã³ã°ã®åŸã2ã€ã®å€§ããªå€æŽãå ããŸããã
- ã€ã³ã©ã€ã³é ååæåã®åé€
-
Math.XXX(..)
æ©èœãMath.XXX(..)
é¡äŒŒç©ã«MathF.()
ãããã®å€æŽã«ã€ããŠã¯ã以äžã§è©³ãã説æããŸãã
ã€ã³ã©ã€ã³é ååæåã®åé€
ãããå¿ èŠãªçç±ã®è©³çŽ°ã«ã€ããŠã¯ã Andrei Akinshinã«ãã ãã®åªããStack Overflowã®åçãšããã³ãããŒã¯ããã³ã¢ã»ã³ãã©ã³ãŒããåç §ããŠãã ããã 圌ã¯æ¬¡ã®çµè«ã«éããŸãã
ãããã«
- .NETã¯ããŒãã³ãŒãã£ã³ã°ãããããŒã«ã«é åããã£ãã·ã¥ããŸããïŒ Roslynã³ã³ãã€ã©ãã¡ã¿ããŒã¿ã«å ¥ãããã®ãšåæ§ã
- ãã®å ŽåããªãŒããŒããããçºçããŸããïŒ æ®å¿µãªãããã¯ãïŒåŒã³åºãããšã«ãJITã¯ã¡ã¿ããŒã¿ããé åã®å 容ãã³ããŒãããããéçé åã«æ¯ã¹ãŠäœåãªæéãããããŸãã ãŸããã©ã³ã¿ã€ã ã¯ãªããžã§ã¯ããéžæããã¡ã¢ãªã«ãã©ãã£ãã¯ãäœæããŸãã
- ããã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸããïŒ ããããã ãããããããªæ¹æ³ã§ãããè¯å¥œãªã¬ãã«ã®ããã©ãŒãã³ã¹ãéæãããå Žåã¯ãéçé åã䜿çšããå¿ èŠããããŸãã ãããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããªãã³ãŒã«ãã¡ãœããã§ããå Žåããããããé©åãªããœãŒã¹ã³ãŒããèšè¿°ããã¡ãœããé åã«é åãé 眮ããå¿ èŠããããŸãã
ãã®diffã§è¡ãããå€æŽã確èªã§ããŸãã
Mathã®ä»£ããã«MathFé¢æ°ã䜿çšãã
第äºã«ããããŠæãéèŠãªããšãšããŠã次ã®å€æŽãè¡ãããšã§ããã©ãŒãã³ã¹ãå€§å¹ ã«æ¹åããŸããã
#if NETSTANDARD2_1 || NETCOREAPP2_0 || NETCOREAPP2_1 || NETCOREAPP2_2 || NETCOREAPP3_0 // intnv square root public static Vec operator !(Vec q) { return q * (1.0f / MathF.Sqrt(q % q)); } #else public static Vec operator !(Vec q) { return q * (1.0f / (float)Math.Sqrt(q % q)); } #endif
.NET Standard 2.1以éã
float
å ±éã®æ°åŠé¢æ°ã®å ·äœçãªå®è£ ãååšããŸãã ãããã¯System.MathFã¯ã©ã¹ã«ãããŸãã ãã®APIãšãã®å®è£ ã®è©³çŽ°ã«ã€ããŠã¯ããã¡ããã芧ãã ããã
- å粟床ã®æ°ããæ°åŠAPI
- å粟床ã§æ°åŠé¢æ°ãè¿œå ãã
- æ°ããå粟床æ°åŠAPIã®åäœãã¹ãã¹ã€ãŒãã®æäŸ
- System.Mathããã³System.MathFã¯ãCã©ã³ã¿ã€ã ã®FCALLãšããŠã§ã¯ãªãããããŒãžã³ãŒãã§å®è£
ããå¿
èŠããããŸã
- Math.AbsââïŒdoubleïŒããã³Math.AbsââïŒfloatïŒã移åããŠãããŒãžã³ãŒãã«å®è£
ãã
- ãã©ãããã©ãŒã åºæã®çµã¿èŸŒã¿ããŒã«ã.NETã«è¿œå ããããã®èšèšãšããã»ã¹
ãããã®å€æŽåŸãCïŒãšC ++ã³ãŒãã®ããã©ãŒãã³ã¹ã®éãã¯çŽ10ïŒ ã«æžå°ããŸããã
C ++ïŒVS C ++ 2017ïŒ | .NET FrameworkïŒ4.7.2ïŒ | .NET CoreïŒ2.2ïŒTCãªã | .NET CoreïŒ2.2ïŒTCãªã³ | |
---|---|---|---|---|
æéïŒç§ïŒ | 41.38 | 58.89 | 46.04 | 44.33 |
ã³ã¢å ïŒç§ïŒ | 0.05ïŒ0.1ïŒ ïŒ | 0.06ïŒ0.1ïŒ ïŒ | 0.14ïŒ0.3ïŒ ïŒ | 0.13ïŒ0.3ïŒ ïŒ |
ãŠãŒã¶ãŒç©ºéå ïŒç§ïŒ | 41.19ïŒ99.5ïŒ ïŒ | 58.34ïŒ99.1ïŒ ïŒ | 44.72ïŒ97.1ïŒ ïŒ | 44.03ïŒ99.3ïŒ ïŒ |
ããŒãžãã©ãŒã«ããšã©ãŒã®æ° | 1119 | 4749 | 5776 | 5661 |
ã¯ãŒã¯ã»ããïŒKBïŒ | 4136 | 13,440 | 16,788 | 16,652 |
æŒãåºãã¡ã¢ãªïŒKBïŒ | 89 | 172 | 150 | 150 |
éããªãšã³ããã£ãã¡ã¢ãª | 7 | 13 | 16 | 16 |
ã¹ã¯ãããã¡ã€ã«ïŒKBïŒ | 1428 | 10 904 | 10 960 | 11 044 |
TC-ãã«ãã¬ãã«ã³ã³ãã€ã«ã Tiered Compilation ïŒ.NET Core 3.0ã§ã¯ããã©ã«ãã§æå¹ã«ãªããšæããŸã ïŒ
å®å šãæãããã«ãããã€ãã®å®è¡ã®çµæã以äžã«ç€ºããŸãã
èµ°ã | C ++ïŒVS C ++ 2017ïŒ | .NET FrameworkïŒ4.7.2ïŒ | .NET CoreïŒ2.2ïŒTCãªã | .NET CoreïŒ2.2ïŒTCãªã³ |
---|---|---|---|---|
TestRun-01 | 41.38 | 58.89 | 46.04 | 44.33 |
TestRun-02 | 41.19 | 57.65 | 46.23 | 45.96 |
TestRun-03 | 42.17 | 62.64 | 46.22 | 48.73 |
泚 ïŒ.NET Coreãš.NET Frameworkã®éãã¯ã.NET Framework 4.7.2ã«MathF APIããªãããã§ãã詳现ã«ã€ããŠã¯ããµããŒããã±ãã.Net FrameworkïŒ4.8ïŒïŒã®netstandard 2.1ãåç §ããŠãã ããã
çç£æ§ãããã«åäž
ã³ãŒãã¯ãŸã æ¹åã§ãããšç¢ºä¿¡ããŠããŸãïŒ
ããã©ãŒãã³ã¹ã®éãã解æ¶ãããå Žåã¯ãCïŒã³ãŒããã芧ãã ãã ã æ¯èŒã®ããã«ãåªããCompiler ExplorerãµãŒãã¹ã®C ++ã¢ã»ã³ãã©ã³ãŒããèŠãããšãã§ããŸãã
æåŸã«ãããã圹ç«ã€å Žåããããããã¹ã衚瀺ãåããVisual Studioãããã¡ã€ã©ãŒã®åºåã次ã«ç€ºããŸãïŒäžèšã®ããã©ãŒãã³ã¹ã®æ¹ååŸïŒã

CïŒã¯äœã¬ãã«èšèªã§ããïŒ
ãŸãã¯ããå ·äœçã«ïŒ
CïŒ/ FïŒ/ VB.NETãŸãã¯BCL /ã©ã³ã¿ã€ã æ©èœã®ã©ã®èšèªæ©èœããäœã¬ãã«ã*ããã°ã©ãã³ã°ãæå³ããŸããïŒ
*ã¯ãããäœã¬ãã«ãã¯äž»èŠ³çãªçšèªã§ããããšãç解ããŠããŸãã
泚ïŒåCïŒéçºè ã¯ããäœã¬ãã«ããšã¯äœãã«ã€ããŠç¬èªã®èããæã£ãŠããŸãããããã®é¢æ°ã¯ãC ++ãŸãã¯Rustããã°ã©ããŒã«ãã£ãŠåœç¶ãšèŠãªãããŸãã
ç§ãäœæãããªã¹ãã¯æ¬¡ã®ãšããã§ãã
- refãæ»ããrefãããŒã«ã«
- ãåç §ã«ããåãæž¡ããè¡ã£ãŠã倧ããªæ§é ãã³ããŒããªãããã«ããŸãã å®å šãªã¿ã€ããšã¡ã¢ãªã¯ãå®å šã§ãªãã¿ã€ããããé«éã§ãïŒã
- .NETã®å®å
šã§ãªãã³ãŒã
- ãåã®ç« ã§å®çŸ©ãããCïŒã®äž»ãªèšèªã¯ãããŒã¿åãšããŠã®ãã€ã³ã¿ãæ¬ ããŠãããšããç¹ã§CãC ++ãšã¯å€§ããç°ãªããŸãã 代ããã«ãCïŒã¯ãªã³ã¯ãšãã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãã£ãŠç®¡çããããªããžã§ã¯ããäœæããæ©èœãæäŸããŸãã ãã®èšèšã¯ãä»ã®æ©èœãšçµã¿åãããŠãCïŒãCãC ++ãããã¯ããã«å®å šãªèšèªã«ããŸãã
- .NETã®ãããŒãžãã€ã³ã¿ãŒ
- ãCLRã«ã¯å¥ã®çš®é¡ã®ãã€ã³ã¿ãŒããããŸãããããŒãžãã€ã³ã¿ãŒã§ãã ãªããžã§ã¯ãã®å é ã ãã§ãªããä»ã®å Žæãæãããšãã§ãããããäžè¬çãªã¿ã€ãã®ãªã³ã¯ãšããŠå®çŸ©ã§ããŸãã
- CïŒ7ã·ãªãŒãºãããŒã10ïŒã¹ãã³<T>ããã³ãŠãããŒãµã«ã¡ã¢ãªç®¡ç
- ãSystem.Span <T>ã¯ããã¹ãŠã®ã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ãã©ããããåãªãã¹ã¿ãã¯ã¿ã€ãïŒ
ref struct
ïŒã§ããããã¯ããŠãããŒãµã«é£ç¶ã¡ã¢ãªã¢ã¯ã»ã¹ã®ã¿ã€ãã§ãã ãããŒã®åç §ãšã3çš®é¡ãã¹ãŠã®ã¡ã¢ãªã¢ã¯ã»ã¹ãåãå ¥ããé·ããæã€Spanå®è£ ãæ³åã§ããŸãã
- ãSystem.Span <T>ã¯ããã¹ãŠã®ã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ãã©ããããåãªãã¹ã¿ãã¯ã¿ã€ãïŒ
- äºææ§ïŒãCïŒããã°ã©ãã³ã°ã¬ã€ããïŒ
- ã.NET Frameworkã¯ããã©ãããã©ãŒã åŒã³åºããµãŒãã¹ã
System.Runtime.InteropServices
ãC ++äºææ§ãããã³COMäºææ§ïŒCOMçžäºéçšæ§ïŒãéããŠã¢ã³ãããŒãžã³ãŒããšã®çžäºéçšæ§ãæäŸããŸããã
- ã.NET Frameworkã¯ããã©ãããã©ãŒã åŒã³åºããµãŒãã¹ã
ãŸããç§ã¯Twitterã§å«ã³å£°ãäžãããªã¹ãã«å«ããããã®ããå€ãã®ãªãã·ã§ã³ãåŸãŸããã
- ãã³ã¢ãã ã¹ ïŒããã©ãããã©ãŒã çšã®çµã¿èŸŒã¿ããŒã«ïŒCPUåœä»€ïŒã
- Mark Gravell ïŒãVectorçµç±ã®SIMDïŒSpanã«é©ããŠããŸãïŒã¯ãããªãäœãã§ãã .NET Coreã¯ïŒããã«ïŒïŒç¹å®ã®CPUåœä»€ãããæ瀺çã«äœ¿çšããããã®çŽæ¥CPUçµã¿èŸŒã¿ããŒã«ãæäŸããå¿
èŠããããŸã ''
- Mark Gravell ïŒã匷åãªJITïŒé
å/ééã®ç¯å²çç¥ãªã©ããŸããæ§é Tããšã®ã«ãŒã«ã䜿çšããŠã Jããã®TãŸãã¯ç¹å®ã®CPUïŒBitConverter.IsLittleEndianãVector.IsHardwareAcceleratedãªã©ïŒã
- Kevin Jones ïŒãç¹ã«
MemoryMarshal
ã¯ã©ã¹ãšUnsafe
ã¯ã©ã¹ãããã³System.Runtime.CompilerServices
ä»ã®ããã€ãã«ã€ããŠèšåãSystem.Runtime.CompilerServices
ã
- Theodoros Chatsigiannakis ïŒã
__makeref
ãšãã®ä»ãå«ããããšãã§ããŸãã
- damageboy ïŒãæåŸ
ãããå
¥åã«æ£ç¢ºã«äžèŽããã³ãŒããåçã«çæããèœåãåŸè
ã¯å®è¡æã«ã®ã¿èªèãããå®æçã«å€æŽãããå¯èœæ§ããããŸããïŒã
- ãããŒãã»ããã±ã³ ïŒãILã®åçæŸåºã
- Victor Baybekov ïŒãStackallocã¯èšåãããŠããŸããã ãŸããçŽç²ãªILïŒåçã§ã¯ãªããããé¢æ°åŒã³åºãã§ä¿åãããïŒãèšè¿°ããããšãã§ããŸããããšãã°ããã£ãã·ã¥ããã
ldftn
ã䜿çšããldftn
ãä»ããŠåŒã³åºããŸãã VS2017ã«ã¯projãã³ãã¬ãŒãããããextern + MethodImplOptions.ForwardRef + ilasm.exã®ã¡ãœãããäžæžãããããšã§ãããç°¡åã«ããŸã»
- Victor Baybekov ïŒãMethodImplOptions.AggressiveInliningãã¯ãå€ãã®å°ããªã¡ãœããã§é«ã¬ãã«ã®ã³ãŒããèšè¿°ããJITã®åäœãå¶åŸ¡ããŠæé©åãããçµæãåŸãããšãã§ãããšããæå³ã§ãäœã¬ãã«ããã°ã©ãã³ã°ãã¢ã¯ãã£ãã«ããŸãã ãã以å€ã®å Žåã¯ãæ°çŸã®LOCã¡ãœããã®ã³ããŒïŒããŒã¹ã... "
- ãã³ã»ã¢ãã ã¹ ïŒãåºæ¬ãã©ãããã©ãŒã ãšåãåŒã³åºãèŠçŽïŒABIïŒã䜿çšããp /ã察話ã®ããã«èµ·åããŸããïŒã
- Victor Baibekov ïŒãŸããïŒfsharpã«èšåããã®ã§ãILã¬ãã«ã§JITãŸã§æ©èœãã
inline
ãããããèšèªã¬ãã«ã§éèŠãšèŠãªãããŸããã CïŒããã¯ãã©ã ãïŒããã¯åžžã«ä»®æ³åŒã³åºãã§ããïŒã«å¯ŸããŠïŒãããŸã§ã®ãšããïŒæ¬ èœããŠãããåé¿çã¯ãã°ãã°å¥åŠã§ãïŒãžã§ããªãã¯ãå¶éãããŠããŸãïŒ "
- Alexandre Mutel ïŒãæ°ããçµã¿èŸŒã¿SIMDãUnsafe Utilityã¯ã©ã¹/ ILã®ãã¹ãããã»ãã·ã³ã°ïŒã«ã¹ã¿ã ãFodyãªã©ïŒã CïŒ8.0ã®å Žåãä»åŸã®é¢æ°ãã€ã³ã¿ãŒ... "
- Alexandre Mutel ïŒãILã«ã€ããŠã¯ãFïŒã¯èšèªã§ILãçŽæ¥ãµããŒãããŸããã
- OmariO ïŒã BinaryPrimitives ã äœã¬ãã«ã ãå®å
šã
- æŸäºæµ©äº ïŒãçµã¿èŸŒã¿ã®ã¢ã»ã³ãã©ã¯ã©ãã§ããïŒ ããŒã«ããããšã©ã³ã¿ã€ã ã®äž¡æ¹ã«ãšã£ãŠå°é£ã§ãããçŸåšã®p / invokeãœãªã¥ãŒã·ã§ã³ã眮ãæããåã蟌ã¿ã³ãŒããããã°ãããå®è£
ã§ããŸã ''
- ãã©ã³ã¯A.ã¯ã«ãŒã¬ãŒ ïŒãLdobjãstobjãinitobjãinitblkãcpyblkã
- ã³ã³ã©ããã³ã³ããã ïŒãããŒã«ã«ã¹ãã¬ãŒãžãã¹ããªãŒãã³ã°ããŠããã®ã§ã¯ãªããïŒ åºå®ãµã€ãºã®ãããã¡ãŒïŒ ããããã管çãããŠããªãå¶çŽãšblittableåã«ã€ããŠèšåããå¿
èŠããããŸã:) "
- Sebastiano Mandala ïŒãèšãããããšãã¹ãŠã«ã»ãã®å°ãå ããã ãã§ããæ§é ã®é
眮ããã¡ã¢ãªã®å
å¡«ãšæŽåããã£ãŒã«ãã®é åºä»ãããã£ãã·ã¥ã®ããã©ãŒãã³ã¹ã«ã©ã®ããã«åœ±é¿ããããªã©ãåçŽãªããšã¯ã©ãã§ããïŒã ããã¯ç§èªèº«ãæ¢æ±ããªããã°ãªããªããã®ã§ããã
- Nino Floris ïŒãreadonlyspanãstackallocããã¡ã€ãã©ã€ã¶ãŒãWeakReferenceããªãŒãã³ããªã²ãŒããMethodImplOptionsãMemoryBarriersãTypedReferenceãvarargsãSIMDãUnsafe.AsRefãä»ããŠåã蟌ãŸããå®æ°ã¯ãã¬ã€ã¢ãŠãã«å¿ããŠæ§é ã®ã¿ã€ããèšå®ã§ããŸãïŒTaskAwaiterãšãã®ããŒãžã§ã³ã«äœ¿çšïŒ
ãããã£ãŠãæçµçã«ã¯ãCïŒã䜿çšãããšãC ++ã®ãããªã³ãŒãã確å®ã«èšè¿°ã§ããã©ã³ã¿ã€ã ããã³åºæ¬ã¯ã©ã¹ã©ã€ãã©ãªãšçµã¿åãããŠãå€ãã®äœã¬ãã«ã®é¢æ°ãæäŸã§ããŸãã
ããã«èªã
- é«æ§èœCïŒã®ãã³ãã¬ãŒãã ãã§ããªã³ã»ã¢ã³ãã¬ã¹ã»ãã€ã¹
- ããã©ãŒãã³ã¹ã¯ã€ãºïŒ6-äžåœèª-è±èªèŸæž ïŒ2005幎以æ¥ã2人ã®Microsoftããã¬ãŒãC ++ããã©ãŒãã³ã¹ãšCïŒã®æŠãã«åãçµãã§ããŸãïŒ
- ããã©ãŒãã³ã¹ã¯ã€ãºïŒ6-çµè«ãå®å®æ¢æ»
- C ++ã¯CïŒããã©ããããéãã§ããïŒ
- ãããŒãžCïŒããã³ãã€ãã£ãC ++ã³ãŒãã®æé©å ïŒ2005ïŒ
ãŠããã£ããŒã¹ãã³ã³ãã€ã©ïŒ
- Unityãã©ã®ããã«ããŠC ++ïŒãµãã»ããïŒãC ++ãšåããããé«éã«ããã
- Unity Burst CompilerïŒç°¡åãªããã©ãŒãã³ã¹æé©å
- ãã€ãªãŒãã¹ãã¬ãŒãµãŒãããŒã3ïŒCïŒããã³ãŠããã£ããŒã¹ã
- C ++ãCïŒããã³Unity
- ããŒã¹ãã³ã³ãã€ã©ã®è©³çŽ°-Unite LA