Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using BenchmarkDotNet.Attributes;
- using BenchmarkDotNet.Attributes.Jobs;
- using BenchmarkDotNet.Running;
- using System.IO;
- using System.Text.RegularExpressions;
- using System.Xml.Linq;
- using System.Xml.Serialization;
- namespace Benchmark
- {
- //// * Summary *
- //BenchmarkDotNet=v0.10.14, OS=Windows 10.0.17134
- //Intel Core i7 CPU 920 2.67GHz(Nehalem), 1 CPU, 8 logical and 4 physical cores
- //Frequency=2610645 Hz, Resolution=383.0471 ns, Timer=TSC
- // [Host] : .NET Framework 4.7.1 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.7.3131.0
- // DefaultJob : .NET Framework 4.7.1 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.7.3131.0
- // Method | Mean | Error | StdDev | Scaled | ScaledSD |
- //----------------- |----------:|---------:|----------:|-------:|---------:|
- // UseRegex | 93.30 ms | 1.843 ms | 1.6333 ms | 1.00 | 0.00 |
- // UseLinq2Xml | 100.67 ms | 1.931 ms | 2.3715 ms | 1.08 | 0.03 |
- // UseXmlSerializer | 133.20 ms | 1.013 ms | 0.7911 ms | 1.43 | 0.02 |
- //Regexが一番早いのかぁ。。。
- //Linq2Xmlはこのくらいの差なら見易さ的に選択したい
- //XmlSerializerは1.4倍となると選択しにくいか クラス定義も面倒だし。。
- // StringReader分が不利なのかもしれないが今回はstringからやりたかったので
- class Program
- {
- static void Main(string[] args)
- {
- BenchmarkRunner.Run<ChatBenchmark>();
- //var c = new ChatBenchmark();
- //var r1 = c.UseRegex();
- //var r2 = c.UseXmlSerializer();
- //var r3 = c.UseLinq2Xml();
- }
- }
- //[ShortRunJob]
- public class ChatBenchmark
- {
- // chatからno vpos user_id 本文を読み取る
- string chat = @"<chat thread=""1234567890"" no=""12"" vpos=""123456"" date=""12345678"" date_usec=""12345"" user_id=""1234567"" locale=""ja-jp"">コメント</chat>";
- int count = 10_000;
- [Benchmark(Baseline = true)]
- public int UseRegex()
- {
- var accum = 0;
- for(var i = 0; i < count; i++)
- {
- var no = int.Parse(Regex.Match(chat, "no=\"(.*?)\"").Groups[1].Value);
- var vpos = long.Parse(Regex.Match(chat, "vpos=\"(.*?)\"").Groups[1].Value);
- var id = Regex.Match(chat, "user_id=\"(.*?)\"").Groups[1].Value;
- var comment = Regex.Match(chat, ">(.*)<").Groups[1].Value;
- accum += no;
- }
- return accum;
- }
- [Benchmark]
- public int UseLinq2Xml()
- {
- var accum = 0;
- for(var i = 0; i < count; i++)
- {
- var element = XElement.Parse(chat);
- var no = int.Parse(element.Attribute("no").Value);
- var vpos = long.Parse(element.Attribute("vpos").Value);
- var id = element.Attribute("no").Value;
- var comment = element.FirstNode.ToString();
- accum += no;
- }
- return accum;
- }
- [Benchmark]
- public int UseXmlSerializer()
- {
- var accum = 0;
- var serializer = new XmlSerializer(typeof(Chat));
- for(var i = 0; i < count; i++)
- {
- var c = serializer.Deserialize(new StringReader(chat)) as Chat;
- accum += c.No;
- }
- return accum;
- }
- [XmlRoot("chat")]
- public class Chat
- {
- [XmlAttribute("no")] public int No { get; set; }
- [XmlAttribute("vpos")] public long Vpos { get; set; }
- [XmlAttribute("user_id")] public string UserId { get; set; }
- [XmlText] public string Text { get; set; }
- }
- }
- }
Add Comment
Please, Sign In to add comment