探秘GO语言《比较C#与GO的性能--XML序列化》

摘要:
今天对GO和NET的XML字符串序列化成对象列表做了一个性能比较,得出一些结论。=nil{log.Fatal}log.Println}NET的代码:usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Data;usingSystem.Linq;usingSystem.Text;usingSystem.IO;usingSystem.Text.RegularExpressions;usingSystem.Xml;usingSystem.Xml.Serialization;usingSystem.Xml.XPath;namespaceConsoleApplicationDataInsert{classProgram{staticvoidMain{IListfiles=newList();files.Add;intcount=0;Console.WriteLine;foreach{stringxml=File.ReadAllText;Console.WriteLine;varlistModel=DeserializeasList;count+=listModel.Count;}/*Listlist=newList();list.Add;list.Add;stringxml2=Serializer;**/Console.WriteLine;Console.Read();}staticobjectDeserialize{try{using{XmlSerializerxmldes=newXmlSerializer;returnxmldes.Deserialize;}}catch{returnnull;}}staticstringSerializer{MemoryStreamStream=newMemoryStream();XmlSerializerxml=newXmlSerializer;try{//序列化对象xml.Serialize;}catch{throw;}Stream.Position=0;StreamReadersr=newStreamReader;stringstr=sr.ReadToEnd();sr.Dispose();Stream.Dispose();returnstr;}}publicclassdoc{publicstringurl{get;set;}publicstringdocno{get;set;}publicstringcontenttitle{get;set;}publicstringcontent{get;set;}}}两者都是对一个170M的XML文件进行序列化,将XML字符串序列化成对象列表。GO每次的运行时间大致是12秒左右。可以看出GO在XML的处理上还是比NET慢了一个档次,希望谷歌以后能优化这个功能。

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

GO的代码:

package main

import (
	"encoding/xml"
	"io/ioutil"
	"log"	
)

type Result struct {
	XMLName xml.Name `xml:"ArrayOfDoc"`
	Persons []Person `xml:"doc"`
}

type Person struct {
	Url          string `xml:"url"`
	Docno        string `xml:"docno"`
	Contenttitle string `xml:"contenttitle"`
	Content      string `xml:"content"`
}

func main() {
	
	content, err := ioutil.ReadFile("E:\Xml\test2.xml")
	if err != nil {
		log.Fatal(err)
	}
	var result Result
	timer2 := time.NewTimer(time.Second)
	err = xml.Unmarshal(content, &result)
	
	if err != nil {
		log.Fatal(err)
	}
	log.Println(len(result.Persons))
}

NET的代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.XPath;

namespace ConsoleApplicationDataInsert
{
    class Program
    {
        static void Main(string[] args)
        {
            IList<string> files = new List<string>();
            files.Add(@"E:Xml	est2.xml");
            int count = 0;
            Console.WriteLine(DateTime.Now.ToString() + "  开始解析");
            foreach (var file in files)
            {
                string xml = File.ReadAllText(file);
                Console.WriteLine(DateTime.Now.ToString() + "  读取完毕");
                var listModel = Deserialize(typeof(List<doc>), xml) as List<doc>;
                count += listModel.Count;
            }

            /*
            List<doc> list = new List<doc>();
            list.Add(new doc() { content = "abdcdsfds", contenttitle = "rewrewre", docno = "rtrwetrew", url = "rewrewrewrew" });
            list.Add(new doc() { content = "abdcfewrwdsfds", contenttitle = "rewrewfdsare", docno = "rtrwetrfdsew", url = "rewrewrefdsfwrew" });
            string xml2 = Serializer(typeof(List<doc>), list);
             * */

            Console.WriteLine(DateTime.Now.ToString() + "  解析完成,总共:" + count);
            Console.Read();
        }

        static object Deserialize(Type type, string xml)
        {
            try
            {
                using (StringReader sr = new StringReader(xml))
                {
                    XmlSerializer xmldes = new XmlSerializer(type);
                    return xmldes.Deserialize(sr);
                }
            }
            catch (Exception e)
            {
                return null;
            }
        }

        static string Serializer(Type type, object obj)
        {
            MemoryStream Stream = new MemoryStream();
            XmlSerializer xml = new XmlSerializer(type);
            try
            {
                //序列化对象
                xml.Serialize(Stream, obj);
            }
            catch (InvalidOperationException)
            {
                throw;
            }
            Stream.Position = 0;
            StreamReader sr = new StreamReader(Stream);
            string str = sr.ReadToEnd();

            sr.Dispose();
            Stream.Dispose();

            return str;
        }
    }

    public class doc
    {
        public string url { get; set; }
        public string docno { get; set; }
        public string contenttitle { get; set; }
        public string content { get; set; }
    }



}

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

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

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

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

免责声明:文章转载自《探秘GO语言《比较C#与GO的性能--XML序列化》》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[Swift]遍历集合类型(数组、集合和字典)Python——rrdtool模块的安装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Python3 读取和写入excel

/py_工作/销售/包括/天气。csv'_工作簿函数读取并返回所有工作表● 以列表形式读取_仅:判断是否读取_仅以模式打开Excel文档● 编码:...

POI设置边框

对单元格设置边框时,有上下左右位置之分,所以POI也准备了四个不同的方法。值说明BORDER_DASH_DOTdash-dotborderBORDER_DASH_DOT_DOTdash-dot-dotborderBORDER_DASHEDdashborderBORDER_DOTTEDdotborderhair-lineborderBORDER_DOUBLEd...

(4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)

Opensslrsa是RSA对称密钥的处理工具。opensslpkey是一种通用的非对称密钥处理工具。它们的用法基本相同,因此只有opensslrssa通过示例进行了说明。-Outfilename:默认情况下,opensslrss用于读取文件中的公钥或私钥并将其显示到stdout,此选项用于将读取的内容输出到指定的文件-Passonarg:传递解密密钥文件的...

sql 加减时间

另外,MySQL中还有两个函数subdate(),subtime(),建议,用date_sub()来替代。MySQLperiod_add(P,N):日期加/减去N月。mysql˃selectperiod_add,period_add|period_add|period_add|结果|200810|20080806|MySQLperiod_diff:日期P1-...

git 系列4(文件提交历史)

1查看文件提交历史记录。如果gitlog命令默认不使用任何参数,gitlog将提交时间中列出的所有更新,最新的更新位于顶部;每次更新都有一个SHA-1校验和、作者的姓名和电子邮件地址以及提交时间。提交说明通过在末尾缩进一段来显示——Stat显示每次更新的文件修改统计信息。您还可以给出几个搜索条件并列出符合条件的提交——提交者只显示与指定提交者相关的提交。...

MySQL锁详解

MySQL锁详解update语句执行流程MySQL的锁介绍按照锁的粒度来说,MySQL主要包含三种类型(级别)的锁定机制:全局锁:锁的是整个database。由MySQL的SQLlayer层实现的表级锁:锁的是某个table。由MySQL的SQLlayer层实现的行级锁:锁的是某行数据,也可能锁定行之间的间隙。...