æ°ããæ©äŒã«ãããç§ãã¡ã¯æ°ãã課é¡ã«çŽé¢ããŠããŸãã
- åãã³ãŒãã¯ã.NET Coreããã³MonoãWindowsããã³Linuxãdockerã³ã³ãããŒã§ã©ã®ããã«æ©èœããŸããïŒ
- ä»ãã.NET Coreã«åãæ¿ããŠãæ°ãããã©ãããã©ãŒã ãæ倧éã«æŽ»çšããæ¹æ³ã¯ãããŸããïŒ
- MonoãšXamarinã®èŠéãã¯ã©ãã§ããïŒ
- Roslynããã³.NET Coreãžã®ç§»è¡ã«äŒŽãã.NETã®ãå éšãã§ã©ã®ãããªå€æŽãçºçããŸãããïŒ
ãµã³ã¯ãããã«ãã«ã¯ã§éå¬ãããDotNextã«ã³ãã¡ã¬ã³ã¹ã§ã¯ãããã3é±éã§20人ã®ã¹ããŒã«ãŒã.NETãã©ãããã©ãŒã ã®çŸåšãšæªæ¥ãããã©ãŒãã³ã¹ãšãã«ãã¹ã¬ããã®æé©åã.NETãã©ãããã©ãŒã ãšCLRã®å éšæ§é ã.NETã³ãŒãã®ãããã¡ã€ãªã³ã°ãšãããã°ã«ã€ããŠãã¬ãŒã³ããŒã·ã§ã³ãè¡ããŸãã

ãããŸã§ã®éã4人ã«.NETã®äžçã«ãããå·®ãè¿«ã£ãå€åã«é¢ããçµéšãšæèŠãå ±æããŠããããŸããã ç§ãã¡ã®è³ªåã«çããŸããïŒ
- .NETãã©ãããã©ãŒã ã®çç£æ§ã«é¢ããäžççãªããããšãã¹ããŒãã 8åã® Microsoft MVPã.NETããã©ãŒãã³ã¹ãPro .NETããã©ãŒãã³ã¹ã Sasha Goldsteinã«é¢ããåªããæ¬ã®èè ã
- Riderã®ãªã¢ã¯ãã£ããã«ãããã»ã¹éä¿¡ãããã³ã«ã®äž»ä»»éçºè ãJetBrainsã®Dmitry Ivanov ã
- JetBrainsã®å¥ã®Rideréçºè ã.NET MVPãPh.D.ãACM ICPCã®éã¡ããªã¹ããWeizmann Institute of Scienceã®ãã¹ãã¯Andrei Akinshin ;
- CTO PromarketãšMonoããã³Linuxã®å°é家Nikita Tsukanov ã
Roslynãžã®ç§»è¡ã«äŒŽãã.NETã§äœãå€æŽãããŸãããïŒ

Microsoftã«ãšã£ãŠãRoslynã¯éåžžã«éèŠãªãããžã§ã¯ãã§ãã CïŒããŒã ã®ã»ãŒå šå¡ãããããã7幎éãã®äœæ¥ãè¡ããéåžžã«é·ãéãªãªãŒã¹ã§ããŸããã§ããã ãããŠä»ã圌ã¯ãªãŒãã³ãœãŒã¹ã§githubã䜿çšããŠãããç®ã®åã§èšèªãå€æŽããããã»ã¹å šäœãè¡ã£ãŠããŸãã äžæ¹ã§ã¯ãä»ã®èšèªã®æ§é ãCïŒã«è¿œå ãããšããå¥åŠãªã¢ã€ãã¢ãæã€äººãå€ãããŸãããä»æ¹ã§ã¯ãããã»ã¹å šäœãå ¬ç¶ãšè¡ããã2æéã§ã³ã³ãã€ã©ãæžã3人ã質åã«çããããšãã§ããŸãã ã³ãã¥ããã£ã«ãšã£ãŠ-ããã¯ãšãŠãã¯ãŒã«ã§ãã

å šäœãšããŠãç§ã¯ããºãªã³ãæ¬åœã«å¥œãã§ãã ã³ã³ãã€ã©ãšããŠã¯ãå€ããã®ãããåªããŠããŸããããã©ãŒãã³ã¹ã®ç¹ã§ãå€ãã®ã³ãŒããããæèœã«ãããããŸãã³ã³ãã€ã«ããŸãã ããããCïŒã³ãŒãã®ã³ã³ãã€ã«ã«ã€ããŠè©±ããŠããå Žåã¯ã次ã®æ®µéã§ããJITã³ã³ãã€ã«ã«èå³ããããŸãã å°ãåãŸã§ãMicrosoftã¯RyuJITãšåŒã°ããæ°ãã64ãããJITã³ã³ãã€ã©ãå°å ¥ããŸããã
ãã®äž»ãªã¿ã¹ã¯ã®1ã€ã¯ãJITã³ã³ãã€ã«æéãççž®ããããšã§ãã ãŠãŒã¶ãŒã«éåžžã«ã¯ã€ãã¯ã¹ã¿ãŒããæäŸããŸããããã®ããã¯ãŒã«ãªæé©åãè¡ãããšãã§ããªããããã³ãŒãèªäœã®å®è¡é床ã¯ãããããé ããå Žåã«ãã£ãŠã¯å€ãJITãããé ããªããŸãã åæã«ãRyuJITã¯SSEããã³AVXåœä»€ãååã«æŽ»çšã§ããããããã€ãã£ãã³ãŒãã«ã¢ã¯ã»ã¹ããã«1ã€ã®CïŒã®èœåã䜿çšããŠéåžžã«å¹æçãªããã°ã©ã ãå®è£ ããããšãã§ããŸãã
ããã©ãŒãã³ã¹ã®é¢ã§ã¯ãMicrosoftã¯ãçŸåšæŽ»çºã«éçºããŠããå¥ã®ãã¯ãããžã.NET Nativeã«è³ããŠããããã«æããŸãã ãããŸã§ã®ãšãããŸã éåžžã«çã®ç¶æ ã§ãããææã«èŠããŸãã

Roslynã®äž»ãªæ©èœã¯ãMicrosoftãåççãªé床ã§æ°ããæ©èœãè¿œå ã§ããããã«ãªã£ãããšã§ãã 以åã¯ãã¢ã»ã³ããªçšã®ã³ã³ãã€ã©ãšã¹ã¿ãžãªçšã®ã³ã³ãã€ã©ããããŸããã ããã¯ãªããªããŸãããã³ã³ãã€ã©ã¯1ã€ããæ®ã£ãŠããããCïŒã§èšè¿°ãããŠããŸãã

APIã®èŠ³ç¹ããã¯ç¢ºãã«è¯ããªããŸããããããã©ãŒãã³ã¹ãšäœåãªã¡ã¢ãªã«åé¡ãããã解決çã«ã¯ã»ã©é ãç¶æ ã§ãã Visual Studio 2015ã§ã¯ãã¡ã¢ãªãäžè¶³ããŠãããããReSharperãšäžç·ã«å·šå€§ãªãããžã§ã¯ããéãããšãã§ããŸããã
Monoãš.NET Coreãæ¯èŒã§ããŸããïŒ äž¡æ¹ã®èŠéãã¯äœã§ããïŒ
ãµãŒã·ã£ã»ãŽãŒã«ãã¹ã¿ã€ã³
Monoã¯MITã©ã€ã»ã³ã¹ã«åãæ¿ãããŸãã ãã®ãããMicrosoftã¯CoreFxã§Monoãã£ã³ã¯ãã³ããŒããŠäœ¿çšã§ããŸãã ã¢ãã¯ãã£ãããšæ¶ããŠããããã«æããŸãã Monoã«ã¯ã.NET CoreããŸã åäœããªãããã€ãã®ãããããããŸãã ããããMonoã©ã³ã¿ã€ã èªäœã¯ãŸããŸãã§ããGCã¯æè¿ãäžä»£å¥GCã«åãæ¿ããã°ããã§ãJITã¯ããŸãããŸãæ©èœããŸããã ãããŠãå€ãã®å Žå圌ããæžãããã¬ãŒã ã¯ãŒã¯èªäœã¯æ¬çªçšã§ã¯ãããŸãããå€ãã®ãã°ãããããã°ãæ€åºãããé·ãé修埩ãããŠããŸããã å®çšŒåç°å¢ã§Monoã䜿çšããŠããã»ãšãã©ãã¹ãŠã®é¡§å®¢ã«åé¡ããããŸããã ããã¯ãæçµçã«ã·ã¹ãã ããŸã£ããæ©èœããªãã£ãããšãæå³ãããã®ã§ã¯ãããŸããããããã¯.NETã§äœ¿çšãããå質ã¬ãã«ã§ã¯ãããŸããã
ãããã.NET Coreã§ããäºæ ã¯é 調ã«é²ãã§ããŸããã ãããžã§ã¯ãã¯1æã«çµäºããäºå®ã§ããããæ°æ¥åã®3æã«ã6ææ«ã«æºåãæŽããšåœŒãã¯èšããŸããã APIãèšèšã¢ãã«ãã³ãŒãã®ååã¯åžžã«å€åããŠããŸãã
å é±ãASP.NET MVC 6ã®ãããžã§ã¯ããæã€ã¯ã©ã€ã¢ã³ãã®1人ãã2é±éããšã«ã³ãŒããä¿®æ£ããããASP.NET MVC 5ã§ããã¯ããŒãããŠåŸ æ©ããæ¹ãè¯ãããå°ããŸããã 質åã¯ç°¡åã§ã¯ãããŸããã
ã¢ã³ãã¬ã€ã»ã¢ãã³ã·ã³
.NET Coreã¯ç¢ºãã«éåžžã«èå³æ·±ããããžã§ã¯ãã§ããã倧ããªåé²ã§ãããä»æ¥ã§ãæªå å·¥ã®ãŸãŸã§ãã å€ãã®ã©ã€ãã©ãªããŸã ãã®äžã«åºãŠããªãããRCã«ããããšãå¿ããªãã§ãã ããã ããã«ãMicrosoftã¯åžžã«ååãå€æŽããæ¯æ¥ãã¹ãŠãå€æŽãããããã€ãã®ãã°ãä¿®æ£ãããä»ã®ãã°ãè¿œå ãããŸãã 2幎éãproject.jsonãã¡ã€ã«ã«åºã¥ãæ°ãããããžã§ã¯ãã·ã¹ãã ãéçºããã³å®£äŒãããå æ¥ããã¿ç®±ã«æšãŠãããå€ãè¯ãcsprojã«æ»ãããšã決å®ããŸããã ãã®ãããªç¶æ³ã¯ãè¿ãå°æ¥ãå®çšŒåã·ã¹ãã ã.NET Coreã«ç§»è¡ããããšãã欲æ±ãèœèãããŸãã
Monoã¯15幎以äžã«ããã£ãŠéçºãããŠããŸããã ããã¯ãå€ãã®å®åã³ãŒããå®è¡ãã倧人ã®å å®ãªã©ã³ã¿ã€ã ã§ãã ããšãã°ãç§ã¯JetBrainsã§Riderãããžã§ã¯ãïŒã¯ãã¹ãã©ãããã©ãŒã ã®.NET IDEïŒã«åãçµãã§ããŸãã ããã¯ãšã³ãã©ã€ããŒïŒããã¯çŽç²ãªRïŒã§ãïŒã¯Monoã§èµ·åãããŸããã.NET Coreã§ã¯ããŸãæ©èœããŸããã ããã¯éåžžã«ããŸãæ©èœããŸããæ°çŸã®ãããžã§ã¯ããšéåžžã«éèŠãªããžãã¯ã®å¥å šãªã¢ããªã±ãŒã·ã§ã³ã§ã.NETã®ãã¹ãŠã®æ©èœãš* nixã®äžã®ãã¹ãŠãæ£åžžã«èµ·åããŸãã ãã¡ãããç¬èªã®åé¡ããããŸããããããã¯æ£åžžã«æ©èœããé åºã§å®å šã«è§£æ±ºãããŸãã .NET Coreãžã®ç§»è¡ã«ã€ããŠïŒãã®æ°ããã¯ãã¹ãã©ãããã©ãŒã ã©ã³ã¿ã€ã ãããå®å®ãããŸã§åŸ ã€å¿ èŠããããŸãã
ãããŒã¿ã»ãã«ãã
Monoã¯ããªãæçããç°å¢ã§ããã.NET Coreã¯ãŸã ããŒã¿çãšå©çšå¯èœãªã©ã€ãã©ãªã®æ°ã倱ã£ãŠããŸãã ããšãã°ã.NET Coreã§ã¯System.DrawingããµããŒããããªããªããMonoã§ã¯2000幎ã®ã·ã£ã®ãŒãªå¹Žã«ç»å ŽããŸããã
.NET Frameworkã®ã«ãã¬ããžã®ããã©ãŒãã³ã¹ãšå質ã«é¢ããŠãMonoã¯Microsoftãå ¬éããŠããéšåãç©æ¥µçã«ããèªäœã«ç§»è¡ããŠããŸãã MicrosoftãXamarinãè²·åããããšãèãããšãããã»ã¹ã¯ããã«éããªãã¯ãã§ãã ããæç¹ã§ãMonoã¯.NET Coreã®ã¢ããªã³ã«ãªããŸãããçŸæç¹ã§ã¯Monoã䜿çšããã®ãçã«ããªã£ãŠããŸãã
ããããªãŒã»ã€ã¯ãã
ç§ãã¡ã¯ããããããã»ãŒãã¹ãŠã®äººããããæç¹ã§MonoããããããããšããæèŠãæã£ãŠããŸãã Oracleã¯ãã€ãŠãHotSpot JVMãšJRockitãçµã¿åããããšèšã£ãŠããŸããããæçµçã«ã¯JRockitãå»æ¢ããŸããã
ãããã£ãŠãããããåŸ ã€äŸ¡å€ããããMonoãã.NET Coreã«åãæ¿ããŠãã ããã Riderã§ã¯ãMonoã§å€ãã®äœæ¥ãè¡ã£ãŠãããå€ãã®ãšã©ãŒããããã³ãŒãã®å質ã.NET Frameworkãããã¯ããã«äœãããšã確èªããŠããŸãã
é«æ§èœãœãªã¥ãŒã·ã§ã³ã®åéã§ãç¬èªã§ç¬èªã®äœããèãåºãå¿ èŠããããããŸããããããšãããã«äœ¿ããåªããã©ã€ãã©ãªããããŸããïŒ
ã¢ã³ãã¬ã€ã»ã¢ãã³ã·ã³
ç¹å¹è¬ã¯ãªãã誰ã«ã§ãé©ãããŠãããŒãµã«ã©ã€ãã©ãªã¯ãªããšèããŠããŸãã ã¿ã¹ã¯ã®ãœãªã¥ãŒã·ã§ã³ãéžæããå¿ èŠããããŸãã ããŒã¿ããŒã¹ã䜿çšããå Žåãç¹å®ã®ã€ã³ãžã±ãŒã¿ãŒã§ä»ã®ããŒã¿ããŒã¹ãããé«éã«åäœããããŒã¿ããŒã¹ããããŸããã°ã©ãã£ãã¯ã䜿çšããå Žåã2D / 3Dã¬ã³ããªã³ã°çšã®ããŸããŸãªåªããã©ã€ãã©ãªããããŸããããããããç¬èªã®ç¯å²ã®ã¿ã¹ã¯ã«é©ããŠããŸãã åãããžã§ã¯ãã¯ç¬èªã®æ¹æ³ã§äžæã§ããããšãèŠããŠããå¿ èŠããããŸãã ã»ãšãã©ã®å Žåãäžéšã®ã¿ã¹ã¯ã§ã¯ãäžéšã®ãœãªã¥ãŒã·ã§ã³ãä»ã®ãœãªã¥ãŒã·ã§ã³ã«é©ããŠããŸãã
éåžžã«ããããééãïŒãABCãã©ã€ãã©ãªãè¯ããšèãã人ã¯ããããã©ããªã¿ã¹ã¯ã§ãã©ã®ã·ããªãªã§è¿ éã«åäœããããèããããšãªãããããååŸããŠäœ¿çšããŸã...
éèŠãªãã€ã³ãïŒå€ãã®äººãããã©ãŒãã³ã¹ã«ç ©ããããã³ãŒãã®éèŠã§ãªãã»ã¯ã·ã§ã³ã®æé©åã«å€ãã®æéãè²»ãããŠããŸãã ããã«ããé床ãããããåäžããŸããã誰ãæ°ä»ããªãã§ãããã ããã©ãŒãã³ã¹ãåäžãããã«ã¯ã調æ»ãè¡ãããã³ãããŒã¯ãè¡ãããããã¡ã€ã«ãäœæããå¿ èŠããããŸãã
ããããªãŒã»ã€ã¯ãã
åäžã®.NETããŒã ã®ãã¬ãŒã ã¯ãŒã¯å ã§ããããã»ã¹ééä¿¡ã®ããã®ãœãªã¥ãŒã·ã§ã³ãããã€ããããããããããå¿ èŠããããŸãã çŸåšãé«ããã©ãŒãã³ã¹ã®ãœãªã¥ãŒã·ã§ã³ã¯éåžžãäœããã®ãµãŒããŒè² è·ãæå³ããŸãã
1å°ã®ãã·ã³ã®ããã©ãŒãã³ã¹ã®åé¡ã«ã€ããŠè©±ããšãããã¯çµ¶ãã解決ãããŠããŸããããã¯ãããšãã°ãæ £çšçãªCïŒã³ãŒããã¯ããã«è¶ ãããã®ã ããã§ãã éåžžã«è¿ éã«å€æ°ã®é ååç §ããåãæ¿ããå¿ èŠããããããå®å šã§ã¯ãããŸããã ãããªãã§ã¯æ©èœããŸããã ãããŠãRider Frameworkã§ãããã³ã«ãå®è¡ããé«ãããã©ãŒãã³ã¹ãå®çŸããŸãã
ãã«ãã¹ã¬ãã.NETããã°ã©ãã³ã°ã®äž»ãªé£ç¹ã¯äœã§ããïŒ äž»ãªèª²é¡ã¯äœã§ããïŒ
ãµãŒã·ã£ã»ãŽãŒã«ãã¹ã¿ã€ã³
å€ãã®éçºè ã«ãšã£ãŠããã«ãã¹ã¬ããããã°ã©ã ã§äœãèµ·ãã£ãŠããããã¡ã¢ãªã¢ã¯ã»ã¹ã移åã§ããããšãåæãè¡ãå¿ èŠãããããšããããŠå€ãã®åæãããå Žåã¯ããã«ããã¯ãçºçããããšãæ³åããããšã¯å°é£ã§ãã ããã«ã¯å€ãã®ããŒã«ããããŸãããããããç¥ãã䜿çšã§ããããã«ããå¿ èŠããããŸãã
å€ãã®éçºè ã¯ããã«ãããã»ããµã·ã¹ãã ã«ã¢ã¯ã»ã¹ã§ããŸããã Core i7ã§ã¯ãªããå°ãªããšã64ããã»ããµãæèŒãããµãŒããŒã§åãã³ãŒããå®è¡ãããšããŸã£ããç°ãªãåé¡ãçºçããŸãã 2ïŒ ã®æéãèŠããå°ããªããã¯ãçªç¶50ïŒ ãå ããããã«ãªããã¡ã¢ãªåž¯åå¹ ã®åé¡ãçºçãïŒã¡ã¢ãªã·ã¹ãã ããªã¯ãšã¹ãã«ååã«è¿ éã«å¿çã§ããªãïŒããã£ãã·ã¥ãå¹ççã«äœ¿çšãããŸããã .NETéçºè ã¯ã»ãšãã©ã®å Žåããã®ãããªã¿ã¹ã¯ã«çŽé¢ããããšãããããŸããã
ã¢ã³ãã¬ã€ã»ã¢ãã³ã·ã³
.NETã§ã®ãã«ãã¹ã¬ããããã°ã©ãã³ã°ã®è€éãã¯ãä»ã®ãã©ãããã©ãŒã ãšåãã ãšæããŸãã ãã«ãã¹ã¬ããã®äžçãã©ã®ããã«æ©èœããããç解ããå¿ èŠããããŸãã åæããªããã£ããšåæããŒã¿æ§é ã«é¢ããŠã¯ã.NETã§ã¯ããã§ååã§ãã ããã«ãasync / awaitãCïŒ5ã«ç»å ŽããŸãããããã«ããããã«ãã¹ã¬ããã³ãŒããçŸããç解ããããæ¹æ³ã§èšè¿°ã§ããŸãã
ãããŒã¿ã»ãã«ãã
éåžžãããã¹ã¬ãããå¥ã®ã¹ã¬ãããææããããŒã¿ã«ã¢ã¯ã»ã¹ã§ããªãããã«ããæ¹æ³ã¯ãããŸããã Rustã§ã¯ããã®ããã«å€å°ã®éåžžã®ã·ã¹ãã ãäœæãããŸããïŒå²ãåœãŠãç Žå£ããŸãïŒã .NETã§ã¯ãããã¯ãã§ã«éåžžã«é£ããããšã§ã¯ãããŸãããäžæ³šæããã®ä»ã®çç±ã«ãããããã¹ããªãŒã ããå¥ã®ã¹ããªãŒã ã«äœãã転éãããšãäœåãªãã®ãå¥ã®ã¹ããªãŒã ã«éãããããšããããŸãã ãããŠãææè ã¹ã¬ããã¯ããã«ã€ããŠäœãç¥ããªããã圌ãã¯ããã®éå°ãã§åãå§ããããšãã§ããŸãã ãã®å Žåã誰ãç¥ããªããšããã§ç«¶åããæžã蟌ã¿èŠæ±ãçºçããŸãã ãããžã§ã¯ããæé·ããã«ã€ããŠããããžã§ã¯ãã®è¿œè·¡ãšå¯ŸåŠã¯ãŸããŸãå°é£ã«ãªããŸãã
ããããªãŒã»ã€ã¯ãã
ãã質åã§ãã ç§ã¯äœå¹Žããã«ãã¹ã¬ãããããã°ã©ãã³ã°ãã人ã ã«ãããè¡ãæ¹æ³ãæããŠããŸããããç§ã¯ãããèªåã§ç解ããŠããŸããã ãããããäž»ãªèª²é¡ã¯æäžäœã¬ãã«ã§çºçããŸãã倧èŠæš¡ãªéçºè ããŒã ãšå€§èŠæš¡ãªè£œåã«é©ããã¢ãã«ãèãåºãã誰ããããã«è¿œéãããã®ã¢ãã«ã®å¶éã«æ±ºããŠé¥ããªãããšãé¡ã£ãŠããŸãã
RoslynããŒã ã¯ããã«ãã¹ã¬ããçžäºäœçšã®ãã©ã³ã¶ã¯ã·ã§ã³ã¢ãã«ã䜿çšããããšã決å®ããã¡ã¢ãªãŠã©ãŒã«ã«ã¶ã€ãããŸããã æ²èŠ³çãªããã¯ãšèªã¿åã/æžã蟌ã¿ããã¯ã¢ãã«ã§ã¯ãèªã¿åãããã¯ãé·æéãªãªãŒã¹ãããã¹ã ãŒãºãªè»¢åã«çŽé¢ããŸãã
ç¹å¹è¬ã¯ãªããæ°ãã絡ã¿åã£ã俳åªã§ãããç¯çŽããŸãããHelloWorldã¯ããŸãæ©èœããŸãããå®éã«ã¯ãã¹ãŠãããè€éã§ãã
é«æ§èœãªã³ãŒããæžãããã«äœã¬ãã«ã®è©³çŽ°ãç解ããå¿ èŠããããŸããããŸãã¯çŸä»£ã®ãã¬ãŒã ã¯ãŒã¯ããã®å¿ èŠæ§ãæé€ããŸããïŒ
ãµãŒã·ã£ã»ãŽãŒã«ãã¹ã¿ã€ã³
é ä¿¡ããªãã§ãã ããã å¯äžã®è³ªåã¯ãã©ã®çšåºŠå¿ èŠãã§ãã ã¢ã»ã³ãã©ãŒã®èªã¿åããã¡ã¢ãªã¢ãã«ãããã»ããµã®åäœæ¹æ³ã®ç解ãå¿ èŠã§ããïŒ æšæºçãªãã³ã-äœæ¥äžã®ã¬ãã«ããå°ãªããšã1ã€äžã®ã¬ãã«ãç解ããŸãã .NETã§äœæ¥ããŠããå Žåã¯ãOSãã©ã³ã¿ã€ã ãGCããã¬ãŒã ã¯ãŒã¯ã®ä»çµã¿ãç解ããå¿ èŠããããŸãã ããããªããšãåé¡ãèŠã€ãããšããŠãããããä¿®æ£ããæ¹æ³ãããããŸããã
ã¢ã³ãã¬ã€ã»ã¢ãã³ã·ã³
ããã°ã©ããŒã解決ããã¿ã¹ã¯ã«äŸåããŸãã 90ïŒ ã®æéãè»ããæ倧éã®åãåŒãåºãã¿ã¹ã¯ã¯ãããŸããããããã°ã©ããŒã¯ãã°ã®ãªãä¿¡é Œæ§ã®é«ããèªã¿ãããã³ãŒãã確ä¿ããããšãæ€èšããå¿ èŠããããŸãã åé¡ãçºçããæ®ãã®10ïŒ ã®å ŽåïŒãŸãã¯ãåé¡ãæ確ã«çºçãããšæšæž¬ããŸãïŒããããã解決ããããšããŸãããã¯ãããã¹ãŠãå éšã§ã©ã®ããã«çºçããããç¥ãå¿ èŠããããŸãã
å€ãã®äººã ã¯ããã®äººçã§äœãèµ·ãã£ãŠããã®ãç解ããã«ããã©ãŒãã³ã¹ã®åé¡ã解決ããããšããŸãïŒåœŒãã¯ééã£ããã³ãããŒã¯ãäœããæ²ããããã£ããããã¡ã€ã«ãäœæããç©äºãé ãããããã«å€ãã®äœæ¥æéãè²»ããå¥åŠãªã³ãŒããæžããŸãã ãããã®10ïŒ ã®ããã©ãŒãã³ã¹ã¯ãªãã£ã«ã«ãªã±ãŒã¹ã«ããŸã察åŠããã«ã¯ããã¹ãŠãå éšã«ã©ã®ããã«é 眮ãããŠãããã«ã€ããŠå€ããç¥ãå¿ èŠããããŸãã
ãããŒã¿ã»ãã«ãã
æœè±¡åã®åé¡ã¯ããããããªãŒã¯ããåŸåããããããããŒã ã«ã¯ããã¹ãŠãå éšã§ã©ã®ããã«æ©èœããããç解ããŠãã1人ãå¿ èŠãªããšã§ãã æ°åŠãããç¥ã£ãŠãã人ã§ãåãã§ãã åŸæ¥ã®äœã¬ãã«ã®åé¡ã¯ãã¡ã¢ãªãªãŒã¯ããã€ãã£ãã³ãŒãã®äŸå€ãããŒãã®ç Žæã§ãã
ããããªãŒã»ã€ã¯ãã
ç§ã®æèŠã§ã¯ã.NETãšã³ãžãã¢ã¯ãå°ãªããšãããã»ããµãšããã»ããµãã£ãã·ã¥ã®åäœãåå²äºæž¬ã®åäœã®å°ããç解ããã¢ã¬ã€ãšãã£ã¹ã¯ãžã®ã·ãªã¢ã«ã¢ã¯ã»ã¹ãåžžã«äžŠåãããé«éã«åäœããçç±ãç解ããå¿ èŠããããŸãã
ãã¹ããŒããŠã³ãããå Žåã¯ã©ãããã°ããã§ããïŒ æåã®2-3ã¹ãããã¯äœã§ããïŒ
ãµãŒã·ã£ã»ãŽãŒã«ãã¹ã¿ã€ã³
æšæž¬ãªãã ããŒã«ãå®è¡ããããã»ã¹ã§äœãèµ·ãã£ãŠãããã«ã€ããŠã®æ å ±ãååŸããå¿ èŠããããŸãã ã¡ã¢ãªãCPUãã¹ã¬ããã®æ°ã確èªããŠãã ããã çŸåšãå€ãã®ç¡æã®ãŠãŒãã£ãªãã£ããããŸãã ãã®åŸãå€æ°ã®ã¡ãœããããããŸãã ç§ã®ãæ°ã«å ¥ãã¯USEïŒäœ¿çšçã飜åããšã©ãŒïŒã§ãã Linuxããã©ãŒãã³ã¹ã®ãšãã¹ããŒãã§ããBrendan Greggã«ãã£ãŠçºæãããŸããã 䜿çšçãšã¯ããªãœãŒã¹ïŒCPUãã¡ã¢ãªããã£ã¹ã¯ãªã©ïŒããšã«äœ¿çšéã決å®ããå¿ èŠãããããšãæå³ããŸãã 飜å-ãããã®ãã¹ãŠã®ãªãœãŒã¹ã«ã€ããŠãããšãã°ãäžåºŠã«1ã€ã®ãã£ã¹ã¯ãã30åã®ãã¡ã€ã«ãèªã¿åããã©ãããªã©ããµãã¹ã¯ãªãã·ã§ã³ãéå°ãã©ãããå€æããå¿ èŠãããããšãæå³ããŸãã ãšã©ãŒ-ããã°ã©ã å ã®ãšã©ãŒã®æ°ã ãã®åŸãäœããæé©åã§ããŸããããã»ããµãè¿œå ããããã³ãŒããæ¹åããŸãã ããã¯äžè¬çã§ãã
ã¢ã³ãã¬ã€ã»ã¢ãã³ã·ã³
æåã«è¡ãããšã¯ãäœãæ£ç¢ºã«é ããªããããããã¡ã€ã«ãç解ããããšã§ãã éåžžã«ããããééãã¯ããããã¡ã€ãªã³ã°ãªãã®æé©åã§ãã ããã«ããã¯ãèŠã€ãã£ããã次ã®è³ªåã¯ãã³ãŒãã®ãã®ã»ã¯ã·ã§ã³ã®é床ãäœäžããã®ã¯ãªãã§ããããšãã質åãèªåããããšã§ãã ããã§ã¯ãæ¬åœã«å€ãã®ç¥èãå¿ èŠãªå ŽåããããŸããã©ã®èŠå ãæ¬åœã«éèŠããæšæž¬ãããããã®ã¿ã確èªããå¿ èŠããããŸããããããªããšãããã°ã©ããŒãäžå¿ èŠãªäœæ¥ã«å€ãã®æéãè²»ããå±éºããããŸãã ãããŠ3çªç®ã®ã¹ãããã¯ãåé¡ãä¿®æ£ããããã°ã©ã ãå®éã«é«éã«åäœããããšãæ éã«ç¢ºèªããããšã§ãïŒãŸããæé©åäžã«äœãäžæãããªãã£ãããšã確èªããŸãïŒã
ããããªãŒã»ã€ã¯ãã
ã¯ã©ã·ãã¯ã§ã¯ããããã¡ã€ã©ãŒã䜿çšããŠããã«ããã¯ãèŠã€ããŠä¿®æ£ããããšããå§ãããŸãã ãããããã§ã«ãããæ°åè¡ã£ãŠããå ŽåãççŽã«èšã£ãŠããã«ããã¯ã¯æ®ã£ãŠããããæ°è¡ä¿®æ£ããããšã§ããã°ã©ã ãæ°åã¹ããŒãã¢ããããããšã¯ã§ããŸããã ãããã®å Žåã«ã¯ãã¢ãããŒããä¿®æ£ããå¿ èŠãããå ŽåããããŸããããšãã°ãã³ãŒãã«ãã£ãŠAssert'esãæ¿å ¥ããå²ãåœãŠãããæéå ã«æäœãå®äºããããã«ããŸãã ãããŠãããŒã ã®åã¡ã³ããŒã«ãèªåã®è²¬ä»»ç¯å²ã«è©²åœããããã©ãŒãã³ã¹ã¢ãµãŒã·ã§ã³ãä¿®æ£ãããã匷å¶ããŸãã ãŸããã¡ã¢ãªãã©ãã£ãã¯ã確èªããŠããããšã®æŠããéå§ããããšã圹ç«ã¡ãŸãã å®å šã§ãªãå Žæã«è¡ãããšããå¯èœã§ãã
ããã©ãŒãã³ã¹ã®åé¡ãæ¢ãéã«ãæ°ã«å ¥ãã®ããŒã«ã¯äœã§ããïŒ
ãµãŒã·ã£ã»ãŽãŒã«ãã¹ã¿ã€ã³
Windowsã§ã¯ãããã©ãŒãã³ã¹ã«ãŠã³ã¿ãŒããéå§ããå¿ èŠããããŸãã ãã®åŸãç¶æ³ã«äŸåããŸãã å€ãã®åé¡ã¯PerfViewã§ãã解決ã§ããŸãããã倧ããªèŠèŠåã®åé¡ããããŸãã ã¡ãªã¿ã«ãVisual Studio Profilerã¯éåžžã«åªããŠããŸãããšããã§ãã¹ã¿ã³ãã¢ãã³ããŒãžã§ã³ããããŸãã dotMemoryãŸãã¯.NET Memory Profiler âã¡ã¢ãªãããã¡ã€ãªã³ã°çšã
ã¢ã³ãã¬ã€ã»ã¢ãã³ã·ã³
ç§ã¯BenchmarkDotNetãŠãŒãã£ãªãã£ã®ã¡ã³ãããŒã§ãã ãã®ã©ã€ãã©ãªã®ææ°ããŒãžã§ã³ã¯æ¢ã«å®å®ããŠåäœããŠããããã³ãããŒã¯ã®ããã®ååãªæ©äŒãæäŸããŠããŸãã æ®å¿µãªãããã€ã³ã¿ãŒãããã®å€ãã®äººã ã¯ãã¹ããããŠã©ãããšæ°ãµã€ã¯ã«ã«åºã¥ããŠãç¬èªã®èªå®¶è£œãã³ãããŒã¯ãåžžã«äœæããããšããŠããŸãã åæã«ã圌ãã¯ãã¹ãŠã®æ®µéã§åœŒããæ°ä»ããŠããªãåé¡ã«å²ãŸããŠãããå®éšã®çµè«ãå®å šã«å°ç¡ãã«ããå¯èœæ§ããããŸãã ããããããã¯åé¡ã®äžéšã«ãããŸããããã¹ãŠã®ã¬ãŒããå¥è·¡çã«ãã¹ãããã®ç¹å®ã®ç¶æ³ã§ãå®éã«æçšãªãã®ã枬å®ããæ£ããã³ãŒããæžãããšãã§ããŸãã ãã ããã¹ã¿ãžãªã§ã¯ããã©ã«ãã§ãã®æ§æãéžæãããŠãããããåå¿è ã®ããã©ãŒãã³ã¹ãšã³ãžãã¢ã¯2人ã«1人ããDEBUGã§ãã³ãããŒã¯ãéå§ããŸããã
ããã«ããã枬å®å€ãå®å šã«å°ç¡ãã«ãªãå¯èœæ§ãããããšã説æãã䟡å€ã¯ãããŸããã BenchmarkDotNetã¯ããŠãŒã¶ãŒã«ãããã°èšå®ãšã¢ã¿ããããããããã¬ãŒã倧ããªèµ€ãæåã§scããäžè¬çãªãã³ãããŒã¯ææ³ã«æºæ ããé©åãªå ç±ãè¡ããåããã»ã¹ãç°ãªãããã»ã¹ã§æ°åå®è¡ããç°ãªãç°å¢ãæ¯èŒããçµ±èšãèæ ®ãããªã©ãå¯èœã«ããŸã çŸåšããããžã§ã¯ãã®åšãã«ã³ãã¥ããã£ãéãŸã£ãŠãããã©ã€ãã©ãªã¯å€ãã®ããã©ãŒãã³ã¹ç 究ã«ãšã£ãŠäŸ¿å©ã§äººæ°ã®ããããŒã«ã«ãªãã€ã€ãããŸãã
ãããã¡ã€ãªã³ã°ãšããŠãJetBrains補åã®dotMemoryãšdotTraceããå§ãããŸãã ç§ã¯é »ç¹ã«ãããã䜿çšããç§ã¯æ¬åœã«ãããããæ¬åœã«å¥œãã§ãã
ããããªãŒã»ã€ã¯ãã
ãã¹ãŠã®ããŒã«ïŒdotTraceãdotMemoryã ã»ãšãã©ãã¹ãŠã«ååã§ãã syså éšãŠãŒãã£ãªãã£ãèŠãå¿ èŠãããå ŽåããããŸãã
.NET Performanceãèªãã§èŠãããšããå§ãããŸããïŒ
ãµãŒã·ã£ã»ãŽãŒã«ãã¹ã¿ã€ã³
ãªã³ã©ã€ã³ã«ã¯å€ãã®è³æããããè€æ°ãµã€ãã«é¢ããç§ã®ã³ãŒã¹ããããŸããMicrosoftéçºè ã®å€ãããã°ïŒRico MarianiãChris BruãVance MorrisonïŒã«ã¯éåžžã«å€ãã®æ å ±ããããŸãã æ¬ã«ã€ããŠïŒç§ã®æ¬Pro .NET PerformanceããããŸãããæ°ããæ¬ããããŸã -Ben Watsonã® "High Performance .NET Applications"ã§ãã ãŸããéåžžã«èå³æ·±ãããšã«æžãããŠããŸãã ããã«ã.NETããã€ã¹ã«ã€ããŠäœããç¥ããç解ããå¿ èŠããããŸãã CïŒãä»ããå€å žçãªæ¬CLRããããŸãã å°ãæ代é ãã§ãããäŸå€ãããªã²ãŒããã©ã®ããã«æ©èœããããªã©ãããã€ãã®ãã€ã³ãã¯ä»ã®ã©ãã«ãèšåãããŠããŸããã
ã¢ã³ãã¬ã€ã»ã¢ãã³ã·ã³
ã¢ã«ãŽãªãºã ãããŒã¿æ§é ã䜿çšãããã©ãããã©ãŒã ã«ã€ããŠã®åºæ¬çãªç¥èããªããã°ãç§ã¯äžäžã«ç§»åããCPUã¬ãã«ã«ç§»åããŸããïŒäžéšã®äººã¯ããããããšããŠããŸãïŒã .NETã«ãããšãåãRichterãèªãã§ãåºæ¬ã¯ã©ã¹ãã©ã®ããã«æ©èœãããªãããããåªããŠããã®ããç解ã§ããŸãã ã©ã³ã¿ã€ã ããã€ã¹ãç解ããããšã¯éåžžã«éèŠã§ããGCã®ä»çµã¿ãã¯ã©ã¹ã®æ§é ãšã®éããJITã³ã³ãã€ã©ãšã¯äœããªã©ã
ããã«ãææ°ã®ããŒããŠã§ã¢ãç¹ã«Intelããã»ããµïŒå°ãªããšãäžè¬çã«ã¯ïŒãã©ã®ããã«æ©èœããããç解ããŠãããšããã§ãããã ããã«é¢ããŠãã€ã³ã¿ãŒãããã«ã¯å€ãã®ãªãœãŒã¹ããããŸãããããã¯éåžžã«èªã¿ã«ããããšããããããŸããå€æ¹ã«ã¯æ¬ãèªãã§CPUããã€ã¹ã®è©³çŽ°ãææ¡ããããšã¯ã§ããŸããã
ãã ããããã©ãŒãã³ã¹ã«ç¹åããŠããªãããäŒæ¥ã§åããŠãã人ã¯ãããå¿ èŠãšããŸããã ç§ã¯ãã®ãããªäººã ã«äžè¬çãªååŠãåºããèŠéãåºããããå§ããŸãã ãã®ç¹ã§ãDotNextã®ãããªäŒè°ã«åºåžããããšã¯çŽ æŽãããããšã§ãã ç§èªèº«ã¯ãå°éçã«è¡ã£ãŠããªãåéã®ã¬ããŒããèŠãã®ã倧奜ãã§ãã ãããã«ãããç§ã¯ããã°ã©ãã³ã°ã®ãã¹ãŠã®åéã«å®å šã«åŸäºããæéã¯ãããŸããããå°ãªããšãç§ã¯äžè¬çãªèããæã¡ãé¢é£ãããããã¯ã«ã€ããŠä»ã®ããã°ã©ããŒãšè©±ãããšãã§ããŸãã æ°ããé åã«é¢é£ããåé¡ã解決ããå¿ èŠãããå Žåã¯ãã©ã®æ¹åããæ€çŽ¢ãéå§ããäœãã°ãŒã°ã«æ€çŽ¢ããããããããŸãã
ããããªãŒã»ã€ã¯ãã
Sasha Goldsteinã®ã¬ããŒãã«ã¢ã¯ã»ã¹ããŠãã ãã:)圌ã®æ¬ãèªãã§ãããããã©ãŒãã³ã¹ã®æé©åãå¿ èŠãšããã¿ã¹ã¯ãå¿ ãå®è¡ããŠãã ãããããããªããšãè³ã¯æ å ±ãäžå¿ èŠã«åçŽã«ç Žæ£ããŸãã
ãµã³ã¯ãããã«ãã«ã¯ã®DotNextã§äœã話ããŸããïŒ
ãµãŒã·ã£ã»ãŽãŒã«ãã¹ã¿ã€ã³
ãããã¡ã€ãªã³ã°ããŒã«ãšã¡ã¢ãªã¢ãã«ã«é¢ãã2ã€ã®ã¬ããŒãããããŸãã æåã«ãPerfViewã䜿çšããŸãã åæããããã©ãŒãã³ã¹ã®åé¡ãå«ãã³ãŒãäŸãçšæããŸããã PerfViewã¯ãETWãã¯ãããžãŒã®ããã³ããšã³ãã§ãã ã¡ãªã¿ã«åœŒå¥³ã«ã€ããŠã¯ãDotNextã«é¢ããå¥ã®ã¬ããŒãããããŸãã ETWã¯ããã°ãåéã§ãããã¯ãããžãŒã§ãã Windowsã.NETãCLRãASP.NETã®å€ãã®ã³ã³ããŒãã³ãããã®ãã°ã«æžã蟌ã¿ãŸãã ãããŠããããã®ãã°ãéåžžã«é«éã§æžã蟌ã¿ãŸãã PerfViewã¯ãETWãã°ã®å¹æçãªåæã§ãïŒCPUãã©ã³ã¿ã€ã ãããŒã¿ããŒã¹ã¢ã¯ã»ã¹ãå²ãåœãŠãããã¡ã€ãªã³ã°ã
2çªç®ã®ã¬ããŒãã¯ãã¡ã¢ãªã¢ãã«ã«é¢ãããã®ã§ãã ã¡ã¢ãªã¢ãã«ã¯ããã¹ãŠã®é«ã¬ãã«èšèªã®ãã¹ãŠã®ã¡ã¢ãªæäœã®ãæããååã§ãã ããã°ã©ã ã1ã€ã®ã¹ã¬ããã§åäœããå Žåããã¹ãŠãåçŽã§ãããå€ãã®ã¹ã¬ãããããå Žåãç¶æ³ã¯å€ãããŸãã æžã蟌ã¿ãšèªã¿åãã¯ãæå®ããé åºã«ãªããªãå ŽåããããŸããã³ã³ãã€ã©ã¯éåžžãã¡ã¢ãªã¢ã¯ã»ã¹ã®äžéšãæé©åã§ããŸãã ããã»ããµã§ãåãã§ãã ãããŠãããŒããIntelããARMã«äœããããšããã¹ãŠã®iPhoneãAndroidããŸãã¯Power PCã«ãªãããã¹ãŠã®è»ã§ãããã»ããµèªäœãããå€ããèš±å¯ãããããå€ãã®ãã¹ãŠãæ©èœããªããªããŸãã
Intelãæ£åžžã«åäœããå Žåãããã€ãã®çè«çããã³å®çšçãªäŸã瀺ããŸãããiPhoneã§ç Žæãããã1ã€ã®ã¹ããªãŒã ããè€æ°ã®ã¹ããªãŒã ã«åãæ¿ãããšãã«Intelãåãæ¿ãã£ãå Žåããã®ã³ãŒããèŠãŠãã人ã¯ã»ãšãã©ããŸãããããåé¡ã§ãã ã¡ã¢ãªã¢ãã«ã®åŸ®åŠããåæããåŸãæ£ããåæã§æ£ãããã«ãã¹ã¬ããã³ãŒããæ§ç¯ããæ¹æ³ã®äŸã«é²ã¿ãŸãã
ã¢ã³ãã¬ã€ã»ã¢ãã³ã·ã³
ç®è¡ã«ã€ããŠã話ããŸãã åçŽãªç®è¡åŒã§ããã°ã©ããè¿·æãªééããç¯ãããã®åŸæ°é±éã«ããã£ãŠæ€çŽ¢ããããã°ãäœæããæ¹æ³ãäœåºŠãèŠãŠããŸããïŒãªããããã§æ°åŠã®éšåãæ£ããæ©èœããªãã®ã§ããïŒïŒæµ®åå°æ°ç¹ã
ç®è¡ããã©ãŒãã³ã¹ããæ°åŒãé«éåããããã«æ°åŒã§å®è¡ã§ããåçŽãªå€å®¹ã«ã€ããŠèãã人ã¯ããã«å°ãªããªããŸãã
ããšãã°ãCPUã¯ããŒããŠã§ã¢ã¬ãã«ã§1ã€ã®ã¹ã¬ããã«éãããã³ãã³ãã䞊ååã§ããŸãããé©åãªäžŠååãè¡ãã«ã¯ãé©åã«èšè¿°ããå¿ èŠã®ããé©åãªã³ãŒããå¿ èŠã§ãã ããã«ããã¯ãèŠã€ãããèšç®ãæé©åããå¿ èŠãããå Žåã¯ãè¿œå ã®ç¥èãé©çšããŠã³ãŒããå°ã工倫ããã®ãçã«ããªã£ãŠããŸãã
ãããŒã¿ã»ãã«ãã
éçºãšå±éã®ããã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã®èŠçŽ ãšããŠã®Dockerã«ã€ããŠè©±ãäºå®ã§ãã ãã€ã¯ããµãŒãã¹ãè¿ éãã€å¹ççã«å±éããã³ç®¡çããæ¹æ³ã ãŸããDockerã§Windows Server Coreãå®è¡ããæ¹æ³ã«ã€ããŠã説æããŸãã
ããããªãŒã»ã€ã¯ãã
Riderã¯ãIdeaãšReSharperã®ãã€ããªããã§ãã å ±éã®ãªã¢ã¯ãã£ãã¢ãã«ã䜿çšããŸãã ã¢ã€ãã¢ã¯ããã€ãã®ãã©ã¡ãŒã¿ãŒãèšå®ããRïŒã¯ããã«å¿çããã¬ã³ããªã³ã°ã«å¿ èŠãªããŒã¿ãèšå®ããŸãããã®ãããªããã»ã¹ã¯æ°åç¹°ãè¿ãããšãã§ããŸãã
Rider Frameworkã¯ãã¿ãŒã²ããèšèªã®DSLããã®Javaããã³.NETãªã¢ã¯ãã£ãã©ã€ãã©ãªããã³ã¢ãã«ãžã§ãã¬ãŒã¿ãŒã§ãã DSLã¯Kotlinã§èšè¿°ãããŠããŸããããã¯ãKotlinã®æ§ææ©èœã«ãããGroovyã¹ã¿ã€ã«ã®ã¡ã¿ããã°ã©ãã³ã°ãèš±å¯ãããŠããããã§ãã ã¬ããŒãã¯ã©ã€ããã¢ã«ãªããŸãã
ç§ã®ã¬ããŒãã¯ãã¢ãŠãããã»ã¹ã¢ããªã±ãŒã·ã§ã³ãäœæããã人ãããªã¢ã¯ãã£ããã¬ãŒã ã¯ãŒã¯ã«é¢å¿ãããããã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ã«ãªã¢ã¯ãã£ãã¢ãã«ã䜿çšããã人ã«åœ¹ç«ã€ãšæããŸãã
ã¹ããŒã«ãŒã«è³ªåãããå Žåã¯ãããŒãã³ã¢ã®.NETãåãåãããµã³ã¯ãããã«ãã«ã¯ã®å€©æ°ãäœåãäœåå€ããããç¥ããããšæããŸãã6æ3æ¥ã«DotNext 2016 Piterã«ã³ãã¡ã¬ã³ã¹ã§ãåŸ ã¡ããŠããŸãã