![](https://habrastorage.org/files/332/51f/58e/33251f58e3504ade9dba5757ef38311a.png)
ã¯ããã«ãããã€ãã®äºçŽãšã³ã¡ã³ãã ãŸããããã©ãŒãã³ã¹è©äŸ¡ããã»ã¹ã¯è€éã§ãã 枬å®ãé£ããã ããããå®éã®åé¡ã¯ããã°ãã°äœãã®ããã©ãŒãã³ã¹ãè©äŸ¡ããçç±ãå¿ããããšã§ãã ç§ãã¡ã¯è€éãªãã«ããã·ã³éèã·ã¹ãã ãæ¡çšããçªç¶ã·ãªã¢ã«åãå®è¡ããã³ãŒãã«éåžžã«éäžããŸããããããåé¡ã ãšèããŠããŸãã ã10,000å埩ã®forã«ãŒããèšè¿°ããå®è¡æéãxããªç§ççž®ããããšã§ãã®ã·ãªã¢ã«åãæé©åã§ããã°ããã¹ãŠãããŸããããŸããã
第äºã«ãããã¯ããã©ãŒãã³ã¹æ¯èŒçµæã®æçš¿ã§ã¯ãããŸããã ãããåç §ããããèŠãŠïŒ Xã©ã€ãã©ãªã¯Yã©ã€ãã©ãªãããåªããŠããŸãããŸãã¯.Netã¯JavaãããåªããŠããŸãïŒã代ããã«ãæçãªã¹ããŒãªãŒãšäžé£ã®äžè¬çãªã¬ã€ãã©ã€ã³ãšèŠãªããŠãã ããã ç§ã¯ãã®ã¹ããŒãªãŒã次ã®ç¹ã匷調ããããã«äœ¿çšããŸãã
- 枬å®å¯Ÿè±¡ã100ïŒ ç解ããŠããŸããïŒ
- Visual Studioãããã¡ã€ã©ãŒãANTSããŸãã¯.dotTraceãªã©ã®ãããã¡ã€ã©ãŒãå®è¡ããŸãããïŒ
- ãŠã©ãŒã ã¢ããæéãèæ ®ããŠããŸããïŒ æ確ã«åºå¥ããã枬å®å€ãç Žæ£ããŸããïŒ çµæã¯çµ±èšçã«ææã§ããïŒ
- 䜿çšããã©ã€ãã©ãªã¯ãŠãŒã¹ã±ãŒã¹ã«æé©åãããŠããŸããïŒ ããªãã®ãŠãŒã¹ã±ãŒã¹ãäœã§ãããç¥ã£ãŠããŸããïŒ
1ã€ã®æªãããã©ãŒãã³ã¹ã¹ã³ã¢
æè¿ãããèªè ã.Netã§ã®ã·ãªã¢ã«åã«é¢ãã質åãã¡ãŒã«ã§éã£ãŠããŸããã 圌ã㯠2009幎ã«ã°ã©ãããã£ãŒããå«ãçç£æ§ã«é¢ããéåžžã«å€ãèšäºãèªã¿ãç¬ç«ããŠããã€ãã®ãã¹ããå®æœããŸããã 圌ãã¯ãã·ãªã¢ã«åæéïŒæ°äžèŠçŽ ïŒã700ããªç§ãè¶ ããããªã¥ãŒã ãçŽ2ã¡ã¬ãã€ãã§ããããšãèšé²ããŸããã ãã®ãã¹ãã§ã¯ãäžé£ã®ç°ãªãã©ã€ãã©ãªã䜿çšããŠãCïŒãšJavaã®äž¡æ¹ã§å žåçãªããŒã¿æ§é ãã·ãªã¢ã«åããŸããã ã©ã€ãã©ãªã«ã¯ãèªç€Ÿã®ã·ãªã¢ã©ã€ã¶ãŒããã€ããª.Net DataContractãããã³JSON.NETãå«ãŸããŠããŸããã ããã±ãŒã¹ã§ã¯ãã·ãªã¢ã«åã«ããå°éã®ããŒã¿ïŒå€§ããªæ§é ã®å Žåã¯1.8 MBïŒãåŸãããå¥ã®ã±ãŒã¹ã§ã¯ãé«éã«ïŒ94ããªç§ïŒåäœããŸããããæãããªåè ã¯ããŸããã§ããã èªè ã¯æ°ã倱ãããã«ãªããããæå³ã§ã¯ã.Netã䜿çšããŠåé¡ã解決ãã¹ãã§ã¯ãªããšå€æããŸããã
ç§ã®æèŠã§ã¯ããã®ããã©ãŒãã³ã¹è©äŸ¡ã«ã¯äœãåé¡ããããŸãã äœã枬å®ãããŠãããã¯æããã§ã¯ãããŸããã 枬å®ãä¿¡é Œã§ãããã®ã§ãã£ããã©ããã¯æ確ã§ã¯ãããŸãããå ·äœçã«ã¯ãããNetã¯é ãããšããæ®éçãªçµè«ã¯ãæ瀺ãããããŒã¿ãèæ ®ãããšæ£åœåãããŸããã§ããã
ããŒã...ããã¯.Netã¯äœäžãã®ããŒã¿æ§é ããã°ããã·ãªã¢ã«åã§ããªãã®ã§ããïŒ ç§ã¯ãããã§ããããšãç¥ã£ãŠããŸãã
åç §ïŒ äŸ¡å€ã®ãããã³ãããŒã¯ãšçµæã®äœæ ã @ Kellabyteã«ãã責任ãããã³ãããŒã¯
ç§ã¯å°é家ã§ã¯ãããŸãããããã®ã³ãŒããå°ãè©ŠããŠã¿ãŸããã
æåã«ïŒç§ãã¡ã¯æ£ãã枬å®ããŠããŸããïŒ
ãã¹ãã§ã¯DateTime.UtcNowã䜿çšããŸãããããã®ãããªå Žåã®äœ¿çšã¯æšå¥šãããŠããŸããã
startTime = DateTime.UtcNow; resultData = TestSerialization(foo); endTime = DateTime.UtcNow;
粟床ãå¿ èŠãªæž¬å®ã«ã¯ãDateTime.NowãŸãã¯DateTime.Utcã䜿çšããªãã§ãã ããã DateTimeã«ã¯ååãªç²ŸåºŠããªã ãæ倧30msã®ãšã©ãŒã§æéãè¿ããŸã ã
DateTimeã¯æ¥ä»ãšæå»ãè¡šããŸãã ããã¯ã粟å¯ã¿ã€ããŒãã¹ããããŠã©ããã§ã¯ãããŸããã
ãšãªãã¯ã»ãªãããŒããèšãããã« ïŒ
äžèšã§èšãã°ããä»ã¯äœæã§ããïŒããããŠãããã¯ã©ã®ãããç¶ããŠããã®ã§ããïŒããŸã£ããç°ãªã質åã§ãã ãã質åã«çããŠå¥ã®è³ªåã«çããããã«èšèšãããããŒã«ã䜿çšããªãã§ãã ããã
ãããŠã¬ã€ã¢ã³ãã»ãã§ã³ãèšãããã« ïŒ
粟床ã¯ç²ŸåºŠãšåãã§ã¯ãããŸããã ä¿¡é Œæ§ãšã¯ãæ£ããçãã«ã©ãã ãè¿ãããšããããšã§ãã 粟床-ç¹å®ã®å¿çã®è§£å床ã
ãã®ãããã¹ããããŠã©ãããå¿ èŠãªå Žæã§ã¯ã¹ããããŠã©ããã䜿çšããŸãã ãµã³ãã«ãã¹ããããŠã©ããã«å€æããåã«ã90,106,103,165,94ã®ãããªããªç§åäœã®å€ãååŸããã¹ããããŠã©ããã«åãæ¿ããåŸãçµæã¯99,94,95,95,94ã§ããã å€ã®å€åã¯ãã£ãšå°ãããªããŸããã
Stopwatch sw = new Stopwatch(); sw.Start(); // stuff sw.Stop();
ãŸããããã©ãŒãã³ã¹ã®ä¿¡é Œã§ããæšå®å€ãååŸããããšããŠããå Žåã¯ãããã»ã¹ãåäžã®ããã»ããµã³ã¢ã«ãã€ã³ãããå¿ èŠããããŸãã ããã¯åé¡ã§ã¯ãªããStopwatchã¯Win32 QueryPerformanceCounterïŒ.Netã®Stopwatchã®ãœãŒã¹ã³ãŒãã¯ãã¡ã ïŒã䜿çšããŸããããã¹ãã1ã€ã®ããã»ããµãŒã§éå§ãããå¥ã®ããã»ããµãŒã§çµäºããå Žåãå€ãã·ã¹ãã ã§ããã€ãã®åé¡ããããŸãã ã
// One Core var p = Process.GetCurrentProcess(); p.ProcessorAffinity = (IntPtr)1;
ã¹ããããŠã©ããã䜿çšããŠããªãå Žåã¯ãããã©ãŒãã³ã¹ãè©äŸ¡ããããã®ã·ã³ãã«ã§æé©ãªã©ã€ãã©ãªãæ¢ããŠãã ããã
2çªç®ïŒçµæãæ°ãã
äžãããããµã³ãã«ã³ãŒãã§ã¯ãçŽ10è¡ã«å®éã®æž¬å®å€ãå«ãŸãã735è¡ã«ãã€ã³ãã©ã¹ãã©ã¯ãã£ããå«ãŸããŠããŠãåä¿¡ããŒã¿ã®åéãšè¡šç€ºãæ åœããŠããŸãã ããã¯åã«èŠãŸãããïŒ ãã€ã³ãã©ã¹ãã©ã¯ãã£ãã§ã¯ããã©ãŒãã³ã¹è©äŸ¡ã倱ãããå¯èœæ§ããããšèšã£ãŠãéèšã§ã¯ãããŸããã
ã ããã©ãŒãã³ã¹ãšããŠã®ããã©ãŒãã³ã¹ ãã«é¢ããæè¿ã®Matt Warrenããããã£ã¹ããèããŠã Mattã®ããã©ãŒãã³ã¹ããã°ã ã芧ãã ãããBenWatsonã®ã Writing High Performance .NET Code ããšããã¿ã€ãã«ã®æ¬ãå¿ ããèªã¿ãã ãã ã
ãŸããMattã¯çŸåšãGitHubã®ããã©ãŒãã³ã¹ãè©äŸ¡ããããã®ã³ã³ãã¯ããªã€ã³ãã©ã¹ãã©ã¯ãã£ã®äœæãè©Šè¡ããŠããããšã«çæããŠãã ããã ãã®ã·ã¹ãã ã¯éåžžã«ææã§ãããåäœãã¹ãå ã§çŽæ¥[ãã³ãããŒã¯]å±æ§ãé©çšããè©äŸ¡ããã»ã¹ãæžããããšãã§ããŸã ã
åçŽãªããã©ãŒãã³ã¹è©äŸ¡ã®ããã«æ¢åã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã䜿çšããããšãæ€èšããŠãã ããã ãããã®1ã€ã¯Yan Cuiã® SimpleSpeedTesterã§ãã 圌女ã¯çŽ æµãªé å€ãäœããããªãã®ããã«å€ãã®éå±ãªä»äºãããŸãã Yanã®ããã°ã§
![](https://habrastorage.org/files/85a/171/429/85a1714293be429788f2779f4630af62.png)
èŠã䟡å€ã®ããããå°ãé«åºŠãªããŒã«ã¯ããé 延ãšããã©ãŒãã³ã¹ã«ææãªã¢ããªã±ãŒã·ã§ã³ã§æž¬å®å€ã®ãã¹ãã°ã©ã ãèšé²ããããã«èšèšããããã©ã€ãã©ãªã§ããHdrHistogramã§ãã ãŸããGitHubã«ããããJavaãCãããã³CïŒã§ã®å®è£ ãå«ãŸããŠããŸãã
![](https://habrastorage.org/files/a10/e6d/f33/a10e6df334234918998552c8524c16da.png)
ãããŠçå£ã«ã ãããã¡ã€ã©ãŒã䜿çšããŸãã
3çªç®ïŒãããã¡ã€ã©ãŒãå®è¡ããŸãããïŒ
Visual Studio Profilerã䜿çšãããã Redgate ANTS Performance ProfilerãŸãã¯JetBrains dotTraceãããã¡ã€ã©ãŒãã©ã€ã¢ã«ãããŠã³ããŒãããŸãã
ã¢ããªã±ãŒã·ã§ã³ã¯äœã«æéãè²»ãããŸããïŒ ãããã¡ã€ã©ãéå§ããã ãã§ãªããè€éãªãã¹ããè¡ãããã©ãã¯ããã¯ã¹ã®äœæ¥ãç 究ãã人ã ã«åºäŒã£ããšæããŸãã
![](https://habrastorage.org/files/e48/7fc/955/e487fc9553f647f490f7b7bde52ab88e.png)
ãšããã§ãåé¡ã解決ããããã®æ°ãã/é©åãª/ç 究ãããæ¹æ³ã¯ãããŸããïŒ
ããã¯ç§ã®æèŠã§ããã泚ç®ã«å€ããããã蚌æããæ°åããããšæããŸãã .Netã§ã·ãªã¢ã«åãå®è¡ããã³ãŒãã®äžéšã¯éåžžã«å€ãã2003幎ãŸãã¯2005幎ã«èšè¿°ãããŠãããæ°ããæè¡ãç¥èã掻çšã§ããªãå ŽåããããŸãã ããã«ãããã¯éåžžã«é«åºŠã«ç¹æ®åãããã³ãŒããšã¯å¯Ÿç §çã«ãããªãæè»ã§ããã¹ãŠã®äººã«é©ãããã³ãŒãã§ãã
人ã ã¯ãã·ãªã¢ã«åã«é¢é£ããããŸããŸãªããŒãºãæã£ãŠããŸãã äœããXMLã«ã·ãªã¢ã«åããçµæãå°ããã³ã³ãã¯ãã«ãªããšæåŸ ããããšã¯ã§ããŸããã åæ§ã«ãæ§é ãJSONã«ã·ãªã¢ã«åãããã€ããªã·ãªã¢ã«åãšåããããé«éã§ããããšãæåŸ ããããšã¯ã§ããŸããã
ã³ãŒãã枬å®ããèŠä»¶ãåæããäžæ©äžãã£ãŠãã¹ãŠã®ãªãã·ã§ã³ãæ€èšããŸãã
4çªç®ïŒæ€èšã«å€ããæ°ãã.Netã·ãªã¢ã©ã€ã¶ãŒ
äœãèµ·ãã£ãŠããã®ãããããŠè²»ããããæéãã©ã®ããã«æž¬å®ããã®ããç解ã§ããã®ã§ãããããã¹ãŠã®ã·ãªã¢ã©ã€ã¶ãèªè ã®ç®æšãéæããŠããªãããšãæããã«ãªããŸããã ç§ãèšã£ãããã«ãããã€ãã¯ãã£ãšåã«æžãããŠããŸãã ã§ã¯ãããé«åºŠã§çŸä»£çãªãªãã·ã§ã³ã¯äœã§ããïŒ
泚ç®ãã¹ã2ã€ã®æ¬åœã«åªããã·ãªã¢ã©ã€ã¶ãŒããããŸãã ããã¯Kevin Montroseã®JilãšMarc Gravellã®protobuf-netã§ã ã ã©ã¡ããçŽ æŽãããã§ãããµããŒããããŠãããã¬ãŒã ã¯ãŒã¯ãšprotobuf-netãã«ãã·ã¹ãã ã®ã«ããŒç¯å²ã¯ç®ãçãã ãã§ãã ãŸãã ServiceStack.NETã«ã¯ãJSONã ãã§ãªãJSVããã³CSVã®ãµããŒããå«ããä»ã®å°è±¡çãªã·ãªã¢ã©ã€ã¶ãŒããããŸãã
Protobuf-net-.NETã®ãããã³ã«ãããã¡ãŒ
ãããã³ã«ãããã¡ã¯Googleã®ããŒã¿æ§é èšè¿°åœ¢åŒã§ãããprotobuf-netã¯.NETã§ã®ãããã³ã«ãããã¡ã®é«æ§èœå®è£ ã§ãã ãããXMLã§ãããããã³ã³ãã¯ãã§é«éã§ããããšãæ³åããŠãã ããã ããã«ãèšèªéã®ã·ãªã¢ã«åã®å¯èœæ§ããããŸãã 圌ãã®ãŠã§ããµã€ãã«ç€ºãããŠãããã®ã¯æ¬¡ã®ãšããã§ãã
ãããã³ã«ãããã¡ã«ã¯ãXMLã§æ§é åããŒã¿ãã·ãªã¢ã«åãããããå€ãã®å©ç¹ããããŸãã ãããã¯ïŒ
- ç°¡åã«
- 3ã10åå°ãªã
- 20ãã100åé«é
- ããæ確ãª
- ããã°ã©ã ã³ãŒãã§äœ¿ããããããŒã¿ã¢ã¯ã»ã¹ã¯ã©ã¹ãçæãã
è¿œå ããã®ã¯ç°¡åã§ããã ããŒã¿æ§é ãè£ é£Ÿããã«ã¯å€ãã®æ¹æ³ããããŸãããåºæ¬çã«ã¯æ¬¡ã®ãšããã§ãã
var r = ProtoBuf.Serializer.Deserialize<List<DataItem>>(memInStream);
protobuf-netã§åŸãæ°å€ã¯äŸå€çã§ããããã®å ŽåãããŒã¿ã¯49ããªç§ã§ãã¿ã€ããã€è¿ éã«å§çž®ãããŸããã
JIL-Sigilã䜿çšãã.NETçšã®JSONã·ãªã¢ã©ã€ã¶ãŒ
Jilã¯Jsonã·ãªã¢ã©ã€ã¶ãŒã§ãããJson.netã»ã©æè»æ§ããããŸããããé床ã®åç®ã§ãã®å°ããªç ç²ã圌ãã«äžããããŠããŸãã 圌ããèšãããšã¯æ¬¡ã®ãšããã§ãã
æè»æ§ãšãã¯ãŒã«ãªæ©èœãã¯ãé床ãè¿œæ±ããéã«æ瀺çã«ç¡èŠãããŸããŸããäžéšã®ã·ãªã¢ã©ã€ã¶ãŒã¯ã¡ã¢ãªå ã®æååãåŠçããŸãããJson.NETãDataContractSerializerãªã©ã®ä»ã®ã·ãªã¢ã©ã€ã¶ãŒã¯ã¹ããªãŒã ãåŠçããŸãã ããã¯ãã©ã€ãã©ãªãéžæãããšãã«ãã·ãªã¢ã«åãããµã€ãºãèæ ®ããå¿ èŠãããããšãæå³ããŸãã
Jilã¯å€ãã®äººã«ãšã£ãŠå°è±¡çã§ãããç¹ã«ïŒXmlSerializersãäžåºŠè¡ã£ãããã«ïŒåçã«ã«ã¹ã¿ã ã·ãªã¢ã©ã€ã¶ãŒãçæããããã§ãã
Jilã¯éåžžã«äœ¿ããããã§ãã ããã ãã§åäœããŸãã äŸãšããŠè¿œå ãã84msã§ã·ãªã¢ã«åããŸããã
result = Jil.JSON.Deserialize<Foo>(jsonData);
çµè«ïŒããã©ãŒãã³ã¹ã®æ¯èŒã¯ããã»ã©åçŽã§ã¯ãããŸãã
äœã枬å®ããŠããŸããïŒ ãªãããã枬å®ããã®ã§ããïŒ ããªãã®æ¹æ³ã¯ãŠãŒã¹ã±ãŒã¹ã«é©ããŠããŸããïŒ 1ã€ã®å€§ããªãªããžã§ã¯ããŸãã¯äœåãã®å°ããªãªããžã§ã¯ããã·ãªã¢ã«åããŸããïŒ
ãžã§ãŒã ãºã»ãã¥ãŒãã³ã»ãã³ã°ã¯ç§ã«äžã€ã®çŽ æŽãããèãããããããŸããïŒ
ãããã©ãŒãã³ã¹ã®æ¯èŒã«é¢é£ããã¡ã¿åé¡ããããŸããéèŠã§ã¯ãªãããã©ãŒãã³ã¹ã®åŸ®èª¿æŽãšã±ã¢ã¯ãå€ãã®éçºè ã®çœªã§ããããã¥ã¡ã³ããéçºè ã®çç£æ§ãæè»æ§ã¯100åã®1ããªç§ãããéèŠã§ããã ã
ãžã§ãŒã ãºã¯ãTwitterã®å€ãïŒãããæè¿ä¿®æ£ãããïŒASP.NETãã°ãææããŸããã ããã¯ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããéèŠãªãšã©ãŒã§ãããããã§ããããã¯ãŒã¯ãä»ããããŒã¿ã®éä¿¡ã«è²»ããããæéã®èŠ³ç¹ããã¯æ¶ããŠãããŸãã
ãã®ãšã©ãŒã¯ãå€ãã®éçºè ãéèŠã§ã¯ãªããšãã«ããã©ãŒãã³ã¹ãæ°ã«ãããšããèããè£ä»ããŠããŸãã
- ãžã§ãŒã ãºã»ãã¥ãŒãã³ã»ãã³ã°ïŒ@JamesNKïŒ2015幎2æ13æ¥
ãã®æçš¿ã®æºåã«ååããŠãããMarc GravellãšJames Newton-Kingã«æè¬ããŸãã
å ã®èšäºã¯ãã®ãªã³ã¯ããå ¥æã§ããŸãã