本文比较多个方式进行配置文件的存储,对比各个不同算法的读写性能。
在应用软件启动的时候,需要读取配置文件,但是启动的性能很重要,所以需要有一个很快的读取配置文件的方法。
如果你不想看过程,那么请看拖动滚动条
本文将会比较三个世界上最好的序列化算法,一个是 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