性能:BinaryFormatter 与 XmlSerializer

2024-02-23

我经常读到 BinaryFormatter 的性能比 XmlSerializer 更好。 出于好奇,我编写了一个测试应用程序。

哎呀,为什么 Xml 比 Bin 快这么多(尤其是反序列化)?

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace SerPlayground
{
    class Program
    {
        static void Main(string[] args)
        {
            var items = new List<TestClass>();
            for (int i = 0; i < 1E6; i++)
            {
                items.Add(new TestClass() { Name = i.ToString(), Id = i });
            }

            File.Delete("test.bin");
            using (var target = new FileStream("test.bin", FileMode.OpenOrCreate))
            {
                System.Threading.Thread.Sleep(1000);
                var bin = new BinaryFormatter();
                var start = DateTime.Now;
                bin.Serialize(target, items);
                Console.WriteLine("Bin: {0}", (DateTime.Now - start).TotalMilliseconds);

                target.Position = 0;
                System.Threading.Thread.Sleep(1000);
                start = DateTime.Now;
                bin.Deserialize(target);
                Console.WriteLine("Bin-D: {0}", (DateTime.Now - start).TotalMilliseconds);
            }

            File.Delete("test.xml");
            using (var target = new FileStream("test.xml", FileMode.OpenOrCreate))
            {
                System.Threading.Thread.Sleep(1000);
                var xml = new XmlSerializer(typeof(List<TestClass>));
                var start = DateTime.Now;
                xml.Serialize(target, items);
                Console.WriteLine("Xml: {0}", (DateTime.Now - start).TotalMilliseconds);

                target.Position = 0;
                System.Threading.Thread.Sleep(1000);
                start = DateTime.Now;
                xml.Deserialize(target);
                Console.WriteLine("Xml-D: {0}", (DateTime.Now - start).TotalMilliseconds);
           }

            Console.ReadKey();
        }
    }

    [Serializable]
    public class TestClass
    {
        public string Name { get; set; }
        public int Id { get; set; }
    }
}

我的结果:

Bin: 13472.7706
Bin-D: 121131.9284
Xml: 8917.51
Xml-D: 12841.7345

因为您正在序列化一个没有任何属性的对象。

如果您序列化实际包含某些数据的不同内容(例如字符串),则二进制序列化程序比 XML 序列化程序快得多。

我对你的代码做了这样的更改:

items.Add("asfd");

我得到这个结果:

Xml: 1219.0541
Bin: 165.0002

当然,部分差异在于 XML 文件比二进制文件大大约十倍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

性能:BinaryFormatter 与 XmlSerializer 的相关文章

随机推荐

  • 404 Page Not Found 您请求的页面未找到。代码点火器[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我在 co
  • 从投影仪闪光灯执行外部 exe

    我们有一个从 AS3 编译的投影仪应用程序 exe 我们如何从投影仪启动另一个 外部 可执行文件 这是代码 它没有做任何可见的事情 Play ACQ Demo Acq addEventListener MouseEvent CLICK cl
  • JavaFX 媒体播放器不播放视频

    Using OpenJFX 11我正在使用媒体播放器在 Linux 系统上播放一些剪辑 其中一些显示 另一些则不显示 据我所知 编码的唯一区别是 未播放的视频包含音轨 这是的输出mediainfo对于播放的视频 General Comple
  • 通过 boost graph 将向量变量导出到图形

    我想导出一个存储字符串值序列的向量来增强图 点文件 最后四行可以解释问题 所需的帮助 我知道代码是错误的 但需要指导来解决这个问题 我想将向量 toponodedist2 存储到图形点文件 这里我想存储一个数组 向量 它将存储索引处的值序列
  • Angular 9 HttpErrorResponse 'JSON.Parse 错误',而响应正常

    为什么这会引发错误 deleteUser userId string this dataService deleteUser userId subscribe response string gt console log response
  • 如何在 Rust 中对向量的元素运行 for 循环并更改 for 循环内部和 for 循环外部的向量?

    我是新来的Rust 我需要在 for 循环之前创建一个向量 在其上运行 for 循环 更改 for 循环内的向量 然后在 for 循环之后更改向量 我尝试了以下代码并尝试使用不可变借用 但两者都不起作用 fn main let mut ve
  • Xcode 4.3 的 pngcrush 在哪里?

    有一个苹果定制版本pngcrush在 4 3 之前的每个 Xcode 版本中 我在 Xcode 4 3 中找不到它 它仍然可以作为独立的吗exe file 另一个相关问题 文件来自哪里Command Line Tools for Xcode
  • 没有访问修饰符的方法

    好吧 这让我很烦恼 我知道我在某处读过它 但谷歌没有帮助 未指定访问修饰符的方法的可访问性级别是多少 void Foo code 我想说internal但我不是100 确定 默认可访问性type is internal 但该类型的默认可访问
  • 如何在 Promela - SPIN 中将 LTL 转换为 Automato?

    如何将 LTL 转换为 PROMELA 中的自动机 我知道使用命令 SPIN f ltl x 可以将 LTL 转换为 never 声明 但我想要 LTL 的自动机而不是否定的自动机 如果我之前否定 LTL 以生成 never 声明 则这是正
  • 为什么int array[1000][1000]是C程序中的内存问题? [复制]

    这个问题在这里已经有答案了 Why int array 1000 1000 C 程序中声明时存在内存问题main方法而不是全局声明 堆栈的大小有限 因此只能保存有限数量的信息 如果程序试图在堆栈上放入太多信息 堆栈溢出将导致 当堆栈中的所有
  • 如何在reactjs中只允许文本框中出现数字?

    如何仅使用正则表达式在reactjs中仅允许文本框中的数字 基本思想是 Use 受控组件 https reactjs org docs forms html controlled components 使用输入字段的 value 和 onC
  • Angular 的 NO_ERRORS_SCHEMA 有问题吗?

    当测试具有子组件的组件时 您有几个选项 导入设置组件和子组件的模块 问题是您实例化真正的子组件及其依赖项 模拟子组件 这可能很乏味 具体取决于它有多少子组件 Use NO ERRORS SCHEMA并忽略子组件 鉴于大多数时候您只关心当前组
  • PHP 简单 HTML DOM 解析器添加脚本标签

    是否可以使用 PHP Simple HTML DOM 解析器在 simple html dom 对象的头部添加一个新的脚本标记 该对象具有主页的完整 html 我需要在该模板中添加一些节点 其中一个节点是带有 jquery 的脚本标记 另一
  • 如何使用硒按住非修饰键(空格键)?

    我遇到了一个问题 硒无法按住不在此列表中的键 Keys SHIFT Keys CONTROL Keys ALT Keys META Keys COMMAND Keys LEFT ALT Keys LEFT CONTROL Keys LEFT
  • 显式实现的接口和通用约束

    interface IBar void Hidden class Foo IBar public void Visible void IBar Hidden class Program static T CallHidden1
  • 如何在 Nestjs 上使用一个路由和多个 dto?

    目前我正在使用 NestJS 构建 Restful api 我有一个ValidationPipe问题 它仅适用于控制器方法 不适用于服务方法 我需要针对不同的情况做出选择DTO class UserCreateDTO StaffCreate
  • chrome 扩展程序在 Facebook 上无法正常工作

    我正在开发一个 chrome 扩展 它应该改变 chrome 中内容可编辑 div 的文本内容 它在 gmail 等网站上运行良好 但在 facebook 上有一个问题 即在更改内容后 关闭包含 div 的对话框 然后打开它 所有更改都会被
  • 这个 html 助手线程安全吗?

    我想知道此链接上接受的答案所引用的代码是否是线程安全的 我的意思是不适合多线程 我只是不想输出跨越用户页面请求 从视图或部分视图将 CSS 或 JavaScript 文件添加到布局头 https stackoverflow com ques
  • Tensorflow 数据集交错 from_generator 抛出 InvalidArgumentError

    我有一个生成器 我正在尝试交错 def hello i for j in tf range i yield j ds tf data Dataset range 10 interleave lambda ind tf data Datase
  • 性能:BinaryFormatter 与 XmlSerializer

    我经常读到 BinaryFormatter 的性能比 XmlSerializer 更好 出于好奇 我编写了一个测试应用程序 哎呀 为什么 Xml 比 Bin 快这么多 尤其是反序列化 using System using System Co