今天对GO和NET的XML字符串序列化成对象列表做了一个性能比较,得出一些结论。

GO的代码:

  1. package main
  2.  
  3. import (
  4. "encoding/xml"
  5. "io/ioutil"
  6. "log"
  7. )
  8.  
  9. type Result struct {
  10. XMLName xml.Name `xml:"ArrayOfDoc"`
  11. Persons []Person `xml:"doc"`
  12. }
  13.  
  14. type Person struct {
  15. Url string `xml:"url"`
  16. Docno string `xml:"docno"`
  17. Contenttitle string `xml:"contenttitle"`
  18. Content string `xml:"content"`
  19. }
  20.  
  21. func main() {
  22.  
  23. content, err := ioutil.ReadFile("E:\\Xml\\test2.xml")
  24. if err != nil {
  25. log.Fatal(err)
  26. }
  27. var result Result
  28. timer2 := time.NewTimer(time.Second)
  29. err = xml.Unmarshal(content, &result)
  30.  
  31. if err != nil {
  32. log.Fatal(err)
  33. }
  34. log.Println(len(result.Persons))
  35. }

  

NET的代码:

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Text;
  7. using System.IO;
  8. using System.Text.RegularExpressions;
  9. using System.Xml;
  10. using System.Xml.Serialization;
  11. using System.Xml.XPath;
  12.  
  13. namespace ConsoleApplicationDataInsert
  14. {
  15. class Program
  16. {
  17. static void Main(string[] args)
  18. {
  19. IList<string> files = new List<string>();
  20. files.Add(@"E:\Xml\test2.xml");
  21. int count = 0;
  22. Console.WriteLine(DateTime.Now.ToString() + " 开始解析");
  23. foreach (var file in files)
  24. {
  25. string xml = File.ReadAllText(file);
  26. Console.WriteLine(DateTime.Now.ToString() + " 读取完毕");
  27. var listModel = Deserialize(typeof(List<doc>), xml) as List<doc>;
  28. count += listModel.Count;
  29. }
  30.  
  31. /*
  32. List<doc> list = new List<doc>();
  33. list.Add(new doc() { content = "abdcdsfds", contenttitle = "rewrewre", docno = "rtrwetrew", url = "rewrewrewrew" });
  34. list.Add(new doc() { content = "abdcfewrwdsfds", contenttitle = "rewrewfdsare", docno = "rtrwetrfdsew", url = "rewrewrefdsfwrew" });
  35. string xml2 = Serializer(typeof(List<doc>), list);
  36. * */
  37.  
  38. Console.WriteLine(DateTime.Now.ToString() + " 解析完成,总共:" + count);
  39. Console.Read();
  40. }
  41.  
  42. static object Deserialize(Type type, string xml)
  43. {
  44. try
  45. {
  46. using (StringReader sr = new StringReader(xml))
  47. {
  48. XmlSerializer xmldes = new XmlSerializer(type);
  49. return xmldes.Deserialize(sr);
  50. }
  51. }
  52. catch (Exception e)
  53. {
  54. return null;
  55. }
  56. }
  57.  
  58. static string Serializer(Type type, object obj)
  59. {
  60. MemoryStream Stream = new MemoryStream();
  61. XmlSerializer xml = new XmlSerializer(type);
  62. try
  63. {
  64. //序列化对象
  65. xml.Serialize(Stream, obj);
  66. }
  67. catch (InvalidOperationException)
  68. {
  69. throw;
  70. }
  71. Stream.Position = 0;
  72. StreamReader sr = new StreamReader(Stream);
  73. string str = sr.ReadToEnd();
  74.  
  75. sr.Dispose();
  76. Stream.Dispose();
  77.  
  78. return str;
  79. }
  80. }
  81.  
  82. public class doc
  83. {
  84. public string url { get; set; }
  85. public string docno { get; set; }
  86. public string contenttitle { get; set; }
  87. public string content { get; set; }
  88. }
  89.  
  90. }

  

两者都是对一个170M(里面有70203个XML对象)的XML文件进行序列化,将XML字符串序列化成对象列表。

GO每次的运行时间大致是12秒左右。

NET的运行时间大致是2秒左右。

可以看出GO在XML的处理上还是比NET慢了一个档次,希望谷歌以后能优化这个功能。

探秘GO语言《比较C#与GO的性能--XML序列化》的更多相关文章

  1. 探秘GO语言《比较C#与GO的性能》

    这段时间也来学学GO语言,听说它的性能相当的棒棒,我就拿C#来和它做比对一下. 这里只是单纯了做了for循环的比对,看看谁的循环快 C# 代码: static void Main(string[] a ...

  2. [笔记]Go语言写文件几种方式性能对比

    Go语言中写文件有多种方式,这里进行如下几种方式的速度对比: 打开文件,写入内容,关闭文件.如此重复多次 打开文件,写入内容,defer 关闭文件.如此重复多次 打开文件,重复多次写入内容,defer ...

  3. [笔记]Go语言的字符串拼装方式性能对比

    Go语言中字符串的拼装方法很多,那么问题来了,到底哪家性能好? 下面代码,分别比较了 fmt.Sprintf,string +,strings.Join,bytes.Buffer,方法是循环若干次比较 ...

  4. Go语言中的数据格式(json、xml 、msgpack、protobuf)

    在分布式的系统中,因为涉及到数据的传输,所以一定会进行数据的交换,此时就要定义数据交换的格式,例如二进制.Json.Xml等等.本篇文章就是总结一下常用的几种数据格式. 一.Json格式 如果想使用J ...

  5. Go语言实现:【剑指offer】序列化二叉树

    该题目来源于牛客网<剑指offer>专题. 请实现两个函数,分别用来序列化和反序列化二叉树. 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建 ...

  6. 【机器学习与R语言】13- 如何提高模型的性能?

    目录 1.调整模型参数来提高性能 1.1 创建简单的调整模型 2.2 定制调整参数 2.使用元学习来提高性能 2.1 集成学习(元学习)概述 2.2 bagging 2.3 boosting 2.4 ...

  7. 【机器学习与R语言】12- 如何评估模型的性能?

    目录 1.评估分类方法的性能 1.1 混淆矩阵 1.2 其他评价指标 1)Kappa统计量 2)灵敏度与特异性 3)精确度与回溯精确度 4)F度量 1.3 性能权衡可视化(ROC曲线) 2.评估未来的 ...

  8. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_6_练习_序列化集合

  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_5_InvalidClassException异常_原理

    序列化一遍 反序列化再来一遍 age的修饰符改为public 直接反序列化就会抛出异常 序列化的时候会给Person.class添加序列号,serialVersionUID,.反序列化需要对比这个se ...

随机推荐

  1. 沉淀再出发:使用python进行机器学习

    沉淀再出发:使用python进行机器学习 一.前言 使用python进行学习运算和机器学习是非常方便的,因为其中有很多的库函数可以使用,同样的python自身语言的特点也非常利于程序的编写和使用. 二 ...

  2. 【最强】微软Tech Summit 2017动手实验室教程

    [最强]微软Tech Summit 2017动手实验室教程 原创 2017-11-07 MSPrecious MSPrecious成长荟 这是! 你绝对找不到的教程! Ignite2016的教程你找到 ...

  3. 如何恢复在Windows 10中被永久删除的照片?

    照片被误删除了需要恢复?这里推荐一款软件:winutilities.使用WinUtilities文件恢复向导允许您通过简单的点击恢复已删除的照片或从Windows 10回收站中恢复被删除的照片. 恢复 ...

  4. metasploit 渗透测试笔记(meterpreter篇)

    0x01 背景 meterpreter作为后渗透模块有多种类型,并且命令由核心命令和扩展库命令组成,极大的丰富了攻击方式. 需要说明的是meterpreter在漏洞利用成功后会发送第二阶段的代码和me ...

  5. 面向对象的JavaScript --- 封装

    面向对象的JavaScript --- 封装 封装 封装的目的是将信息隐藏.一般而言,我们讨论的封装是封装数据和封装实现.真正的封装为更广义的封装,不仅包括封装数据和封装实现,还包括封装类型和封装变化 ...

  6. BZOJ5072:[Lydsy1710月赛]小A的树(树形DP)

    Description BZOJ只是扔了个下载链接 Solution 设$f[x][i]$表示$x$点选中$i$个黑点的最小连通块. 设$g[x][i]$表示$x$点选中$i$个黑点的最大连通块. 转 ...

  7. Mac OS X文件系统的附加属性@如何彻底删除

    有时候在 Mac 系统下读写 NTFS 分区时,会发现一些文件不能打开. 显示错误为: 项目“XXX”已被 OS X 使用,不能打开. 如果再终端 ls -al 命令一下就可以看到: -rwxr-xr ...

  8. 基于Azure Blob冷存储的数据压缩算法测试对比分析

    背景说明: 近期公司的数据增量迅速增长,存储的成本太高,需要采用生命周期进行管理,热存储中的数据或者被删除,或者备份至冷存储.但是冷备时是否要压缩,需要进行验证.Azure本身没有提供压缩的接口,只能 ...

  9. 安装IIS步骤图解

    这几日好些网友来找iis安装包,但是因为新浪爱问的共享资料已关闭导致下载链接不可用,笔者在新浪微盘的备份资料只有5.1版,现共享链接如下: IIS5.1 for windows xp下载链接http: ...

  10. jmeter接口测试1-参数化

    jmeter一个简单的接口测试例子 1.创建一个http请求: 大概的步骤就是: (1)创建一个线程组 (2)添加HTTP信息头管理器:右键线程组,选择,添加user-Agent,key-value形 ...