Guest User

Untitled

a guest
Jul 16th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.75 KB | None | 0 0
  1. using BenchmarkDotNet.Attributes;
  2. using BenchmarkDotNet.Attributes.Jobs;
  3. using BenchmarkDotNet.Running;
  4. using System.IO;
  5. using System.Text.RegularExpressions;
  6. using System.Xml.Linq;
  7. using System.Xml.Serialization;
  8.  
  9. namespace Benchmark
  10. {
  11. //// * Summary *
  12.  
  13. //BenchmarkDotNet=v0.10.14, OS=Windows 10.0.17134
  14. //Intel Core i7 CPU 920 2.67GHz(Nehalem), 1 CPU, 8 logical and 4 physical cores
  15. //Frequency=2610645 Hz, Resolution=383.0471 ns, Timer=TSC
  16. // [Host] : .NET Framework 4.7.1 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.7.3131.0
  17. // DefaultJob : .NET Framework 4.7.1 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.7.3131.0
  18.  
  19.  
  20. // Method | Mean | Error | StdDev | Scaled | ScaledSD |
  21. //----------------- |----------:|---------:|----------:|-------:|---------:|
  22. // UseRegex | 93.30 ms | 1.843 ms | 1.6333 ms | 1.00 | 0.00 |
  23. // UseLinq2Xml | 100.67 ms | 1.931 ms | 2.3715 ms | 1.08 | 0.03 |
  24. // UseXmlSerializer | 133.20 ms | 1.013 ms | 0.7911 ms | 1.43 | 0.02 |
  25.  
  26.  
  27. //Regexが一番早いのかぁ。。。
  28. //Linq2Xmlはこのくらいの差なら見易さ的に選択したい
  29. //XmlSerializerは1.4倍となると選択しにくいか クラス定義も面倒だし。。
  30. // StringReader分が不利なのかもしれないが今回はstringからやりたかったので
  31.  
  32. class Program
  33. {
  34. static void Main(string[] args)
  35. {
  36. BenchmarkRunner.Run<ChatBenchmark>();
  37.  
  38. //var c = new ChatBenchmark();
  39. //var r1 = c.UseRegex();
  40. //var r2 = c.UseXmlSerializer();
  41. //var r3 = c.UseLinq2Xml();
  42. }
  43. }
  44.  
  45. //[ShortRunJob]
  46. public class ChatBenchmark
  47. {
  48. // chatからno vpos user_id 本文を読み取る
  49.  
  50. string chat = @"<chat thread=""1234567890"" no=""12"" vpos=""123456"" date=""12345678"" date_usec=""12345"" user_id=""1234567"" locale=""ja-jp"">コメント</chat>";
  51. int count = 10_000;
  52.  
  53.  
  54. [Benchmark(Baseline = true)]
  55. public int UseRegex()
  56. {
  57. var accum = 0;
  58.  
  59. for(var i = 0; i < count; i++)
  60. {
  61. var no = int.Parse(Regex.Match(chat, "no=\"(.*?)\"").Groups[1].Value);
  62. var vpos = long.Parse(Regex.Match(chat, "vpos=\"(.*?)\"").Groups[1].Value);
  63. var id = Regex.Match(chat, "user_id=\"(.*?)\"").Groups[1].Value;
  64. var comment = Regex.Match(chat, ">(.*)<").Groups[1].Value;
  65.  
  66. accum += no;
  67. }
  68.  
  69. return accum;
  70. }
  71.  
  72. [Benchmark]
  73. public int UseLinq2Xml()
  74. {
  75. var accum = 0;
  76.  
  77. for(var i = 0; i < count; i++)
  78. {
  79. var element = XElement.Parse(chat);
  80. var no = int.Parse(element.Attribute("no").Value);
  81. var vpos = long.Parse(element.Attribute("vpos").Value);
  82. var id = element.Attribute("no").Value;
  83. var comment = element.FirstNode.ToString();
  84.  
  85. accum += no;
  86. }
  87.  
  88. return accum;
  89. }
  90.  
  91. [Benchmark]
  92. public int UseXmlSerializer()
  93. {
  94. var accum = 0;
  95. var serializer = new XmlSerializer(typeof(Chat));
  96.  
  97. for(var i = 0; i < count; i++)
  98. {
  99. var c = serializer.Deserialize(new StringReader(chat)) as Chat;
  100.  
  101. accum += c.No;
  102. }
  103.  
  104. return accum;
  105. }
  106. [XmlRoot("chat")]
  107. public class Chat
  108. {
  109. [XmlAttribute("no")] public int No { get; set; }
  110. [XmlAttribute("vpos")] public long Vpos { get; set; }
  111. [XmlAttribute("user_id")] public string UserId { get; set; }
  112. [XmlText] public string Text { get; set; }
  113. }
  114. }
  115. }
Add Comment
Please, Sign In to add comment