title author date CreateTime categories
C# 配置文件存储 各种序列化算法性能比较
lindexi
2018-08-10 19:16:52 +0800
2018-06-15 12:16:10 +0800
C#

本文比较多个方式进行配置文件的存储,对比各个不同算法的读写性能。 在应用软件启动的时候,需要读取配置文件,但是启动的性能很重要,所以需要有一个很快的读取配置文件的方法。 如果你不想看过程,那么请看拖动滚动条

本文将会比较三个世界上最好的序列化算法,一个是 json 、一个是 ProtoBuf 、一个是 wire

原来我的软件在启动的时候是需要读取很多个文件,因为每个模块的配置都不同,所有模块的配置都是模块自己查找配置文件读取,然而大家都知道,在机械硬盘,随机读取文件的性能很差。现在虽然很多用户都是使用固态硬盘,但是对于启动性能优化,还是要尽量减少在软件启动过程的读取文件。

我询问了奎爷,他是一位强大的程序员,他告诉我,谷歌浏览器把很多零碎的文件,如历史记录和密码都压缩为一个文件,这样的启动时候,顺序读取性能很快,所以浏览器才可以快速启动。

于是我就开始了准备把所有的模块的配置文件合为一个,在合并的时候需要做序列化,因为存在很多模块都是使用自己实现的方式进行序列化。

下面就是我进行对比各个算法的性能。

需要注意,在软件启动的时候,还需要计算 dll 加载的性能,也就是如果有一个dll可以提高序列化性能,但是这个 dll 加载性能很差,也是不能使用这个dll的。

定义

先定义一个简单的类,这个类用来存放数据,只有 key-value 的数据

    [ProtoContract][Serializable]public class Foo{[ProtoMember(1)]public Dictionary<string, string> CurmobeKallbu { set; get; }}

在启动之前就需要读取这个文件作为配置,所以需要找到一个很快的方法从文件读取,然后反序列化。

为了方便序列化,我写了一个方法Foo.BegaymouniWaloujijou用来创建 1000 个随机的 key-value 为数据。因为代码很多,我就不写了,下面就是函数的定义,需要大家写入随机的值

        public static Foo BegaymouniWaloujijou(){return new Foo(){CurmobeKallbu = new Dictionary<string, string>(){// 这里写入随机的值}};}

json

首先是使用最有名的 json 来进行序列化,安装 Nuget 第一个,点击管理nuget,然后点击浏览,现在看到的第一个是不是 json 库?如果不是,那么说明本文已经过期

在看本文的时候,如果要运行本文的代码,需要先在自己的 E 盘创建一个叫回收站的文件夹。因为我在代码会对这个文件夹写入。

            var fileInfo = new FileInfo(@"E:\回收站\xx5");if (!fileInfo.Exists){var foo = Foo.BegaymouniWaloujijou();var stopwatch = new Stopwatch();stopwatch.Start();using (var stream = new StreamWriter(fileInfo.OpenWrite())){var str = JsonConvert.SerializeObject(foo, Formatting.Indented);stream.Write(str);}stopwatch.Stop();Console.WriteLine("写入" + stopwatch.ElapsedMilliseconds);}else{var stopwatch = new Stopwatch();stopwatch.Start();var stream = fileInfo.OpenText();using (stream){var foo = JsonConvert.DeserializeObject<Foo>(stream.ReadToEnd());}stopwatch.Stop();Console.WriteLine("读取时间" + stopwatch.ElapsedMilliseconds);fileInfo.Delete();}

上面的代码很简单,就是使用这个方式保存

那么性能怎样?请看下面

               读取 写入170   188161  150191  168166  164230  156

数据的单位是毫秒,平均时间是读取 183.6 毫秒,写入165.2毫秒

ProtoBuf

这是 谷歌的一个库,我安装了 protobuf-net ,然后进行序列化

         var fileInfo = new FileInfo(@"E:\回收站\xx2");if (!fileInfo.Exists){var foo = Foo.BegaymouniWaloujijou();var stopwatch = new Stopwatch();stopwatch.Start();var stream = fileInfo.OpenWrite();using (stream){Serializer.Serialize(stream, foo);}stopwatch.Stop();Console.WriteLine("写入" + stopwatch.ElapsedMilliseconds);}else{var stopwatch = new Stopwatch();stopwatch.Start();var stream = fileInfo.OpenRead();using (stream){stream.Seek(0, SeekOrigin.Begin);var foo = Serializer.Deserialize<Foo>(stream);}stopwatch.Stop();Console.WriteLine("读取时间" + stopwatch.ElapsedMilliseconds);fileInfo.Delete();}

我尝试在 ssd 和 机械硬盘读写,比较两个的性能

下面是在 ssd 的读写性能,平均时间是读取 91.8 毫秒,写入 119.4 毫秒

               读取   写入90    10884   11593   14280   109112  123

我尝试在机械硬盘读写,平均时间是读取104.4毫秒,写入140.2毫秒

              读取   写入95    127115  163107  16898   128107  115

wire

这是传说中最快的序列化库,我安装了 Wire 然后使用下面的代码,运行 5 次计算读写时间

          var fileInfo = new FileInfo(@"E:\回收站\xx3");if (!fileInfo.Exists){var foo = Foo.BegaymouniWaloujijou();var stopwatch = new Stopwatch();stopwatch.Start();var stream = fileInfo.OpenWrite();using (stream){var serializer = new Wire.Serializer();serializer.Serialize(foo, stream);}stopwatch.Stop();Console.WriteLine("写入" + stopwatch.ElapsedMilliseconds);}else{var stopwatch = new Stopwatch();stopwatch.Start();var stream = fileInfo.OpenRead();using (stream){var serializer = new Wire.Serializer();var foo = serializer.Deserialize<Foo>(stream);}stopwatch.Stop();Console.WriteLine("读取时间" + stopwatch.ElapsedMilliseconds);fileInfo.Delete();}

虽然小伙伴说他是最快的,但是在我的设备,平均读取125.8毫秒,写入101.2毫秒

              读取  写入109   104106  94111   92190   90113   126

自己写的

最后我尝试自己写了简单的序列化,因为存放的信息是key-value,我可以控制包含的字符串都是不带换行,也就是我可以一行放 value 一行放关键字。

           var fileInfo = new FileInfo(@"E:\回收站\xx7");if (!fileInfo.Exists){var foo = Foo.BegaymouniWaloujijou();var stopwatch = new Stopwatch();stopwatch.Start();using (var stream = new StreamWriter(fileInfo.OpenWrite())){foreach (var temp in foo.CurmobeKallbu){stream.WriteLine(temp.Key);stream.WriteLine(temp.Value);}}stopwatch.Stop();Console.WriteLine("写入" + stopwatch.ElapsedMilliseconds);}else{var stopwatch = new Stopwatch();stopwatch.Start();var stream = fileInfo.OpenText();using (stream){var str = stream.ReadToEnd().Split('\n');var foo = new Foo();foo.CurmobeKallbu = new Dictionary<string, string>(str.Length / 2);string key = null;foreach (var temp in str){if (key == null){key = temp;}else{foo.CurmobeKallbu.Add(key, temp);key = null;}}}stopwatch.Stop();Console.WriteLine("读取时间" + stopwatch.ElapsedMilliseconds);fileInfo.Delete();}

我发现在 ssd 和在机械硬盘读写性能几乎没有相差,有时候相同程序在 ssd 运行的时间比在机械硬盘多。在我测试了自己写的程序才知道,最多的时间在序列化,读取文件的时间反而可以被忽略。使用自己写的序列化读取1毫秒,写入7.2毫秒,所以这么简单的配置文件还是自己做序列化比较快。

             读取 写入1 61  81  81  51  9

建议

在软件启动的时候,还有一个读取文件是加载库,如果我使用了第三方的 dll ,那么在启动的时候我就需要加载这个 dll ,但是我读取的配置文件只有不到 100 k 但是我加载的几个库都是很大。加载库的时间已经足够我自己写的序列化读取完成,需要知道,在启动程序的时候不是把所有程序的库都加载,只有在用到的时候才去读取库,读取库也是需要时间,所以程序启动的时候尽量不要引用不相关的库。

所以在启动的过程如果需要读取配置文件,还是使用自己写序列化,而且要求自己写的配置文件很稳定,不要在启动的时候出现异常。

自己写配置文件可以在一个线程进行读取,然后把整个程序所有在启动过程使用配置文件的地方都删除,只有软件启动的过程读取的文件只有很少的几个,最好是一个,这样才能保证软件启动的性能。

代码:C# 配置文件存储 各种序列化算法性能比较 程序1.1-CSDN下载

如果没有积分需要代码请联系我

2018-8-10-C#-配置文件存储-各种序列化算法性能比较相关推荐

  1. 计算机网络部分(共44题),2018年10月自考04741计算机网络原理试卷及答案

    2018年10月高等教育自学考试全国统一命题考试 计算机网络原理 试卷 (课程代码04741) 本试卷共5页,满分l00分,考试时间l50分钟. 考生答题注意事项: 1.本卷所有试题必须在答题卡上作答 ...

  2. 计算机网络原理201810自考,2018年10月自考04741计算机网络原理试卷及答案

    2018年10月高等教育自学考试全国统一命题考试 计算机网络原理试卷 (课程代码04741) 本试卷共5页,满分l00分,考试时间l50分钟. 考生答题注意事项: 1.本卷所有试题必须在答题卡上作答. ...

  3. 2018年10月自考计算机应用基础真题,2018年10月全国自考《计算机应用基础》真题与答案...

    高等教育自学考试的考试时间慢慢临近,备考复习也越来越紧张,四川自考网蓝优悠教育中心的南充自考助手为大家精心准备了"2018年10月全国自考<计算机应用基础>真题与答案" ...

  4. 02325计算机系统结构201810,2018年10月自考02325计算机系统结构真题及答案

    以下是湖南自考生网为考生们整理的"2018年10月自考02325计算机系统结构真题及答案",考生可通过自考历年真题练习更有把握的面对考试,对题型更加熟悉,从而取得更佳的成绩.供考生 ...

  5. 2018计算机系统结构全国卷,2018年10月高等教育自学考试全国统一命题考试02325计算机系统结构试卷及答案.doc...

    2018年10月高等教育自学考试全国统一命题考试 课程代码02325 3页,满分l00分.考试时间l50分钟. 第一部分 选择题 l0小题,每小题l分.共10分.在每小题列如的备选项中 有一项是最符合 ...

  6. 2018全国计算机网络竞赛试题,全国2018年10月04741计算机网络原理真题以及答案解析...

    <全国2018年10月04741计算机网络原理真题以及答案解析>由会员分享,可在线阅读,更多相关<全国2018年10月04741计算机网络原理真题以及答案解析(8页珍藏版)>请 ...

  7. 计算机英语清考,天大2018年10月清考《计算机应用基础》在线考核试题答案

    2018年10月清考<计算机应用基础>在线考核试题-0021 试卷总分:100    得分:0 一. 单选题 (共 50 道试题,共 100 分) 1.输出速度最快的打印机是( ) A.点 ...

  8. 计算机网路原理与应用试题,2018年10月全国自考 04741计算机网络原理历年真题试题及答案...

    <2018年10月全国自考 04741计算机网络原理历年真题试题及答案>由会员分享,可在线阅读,更多相关<2018年10月全国自考 04741计算机网络原理历年真题试题及答案(8页珍 ...

  9. 计算机体系结构考试题及知识点,2018年10月自考02325计算机系统结构真题及答案...

    小编给大家提供的是2018年10月自考02325计算机系统结构真题及答案,大家可以参考下,毕竟历年真题比试题和背知识点有效果. 2018年 10 月高等教育自学考试全国统一命题考试 计算机系统结构试卷 ...

最新文章

  1. [每日一题] 11gOCP 1z0-053 :2013-09-29 Flashback Data Archive ...................................6...
  2. 数据显示,近半数人依然坚持在用 Windows 7
  3. iOSTableview 禁止下拉,允许上拉
  4. python docx库使用样例_Python docx库用法示例分析
  5. Qt中QTableWidget用法总结
  6. Pytorch forward()的简单理解与用法
  7. 9-3 数据分布概论
  8. ZooKeeper 到底解决了什么问题?
  9. Spring boot initialization failed for https://start.spring.io
  10. Oracle-数据库的备份与恢复
  11. javascript中正则匹配多个条件, 常用正则匹配, 正则详解
  12. 如何去掉图片上的logo
  13. python全栈工程师薪资待遇_java,python和全栈工程师学那个在未来更有前途?
  14. 视频教程-亲自动手写一个深度学习框架-深度学习
  15. 艾永亮:百果园的商业模式是什么?打造超级产品引领生鲜电商行业
  16. Chemistry Methods | Image2SMILES+: Transformer-Based Molecular Optical Recognition Engine
  17. 汉字进行计算机识别的原理,计算机OCR文字识别技术的原理和未来发展趋势
  18. java数字金额大写金额_Java实现 “ 将数字金额转为大写中文金额 ”
  19. 深度:从 Office 365 新图标来看微软背后的设计新理念
  20. comsol-添加线圈几何分析

热门文章

  1. Qt/C++ 开发Android平台《林中伊人》消球小游戏全记录1——独立游戏设计的伊始
  2. MSVC编译链接问题
  3. 限制 EditText 输入字符的方法
  4. 强化学习の学习笔记(一)——多臂老虎机、ε-greedy策略、乐观初始值、增量式实现、梯度赌博机
  5. 确认! Python再次夺冠,80%的程序员痛快!你怎么看?
  6. html图片自动淡出变化,用CSS3 transition属性实现淡入淡出轮播图
  7. 整理了一份招PHP高级工程师的面试题(转)
  8. 2021年全球链轮收入大约415百万美元,预计2028年达到496.1百万美元
  9. 雨听 | 网页图片下载
  10. Python入门——EasyGUI库