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


    今天对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慢了一个档次,希望谷歌以后能优化这个功能。

  • 相关阅读:
    JS跨域访问CORS配置
    在Maven中混用Java和Scala
    Linux下开源可视化工具Caravel安装(包含缺少js解决办法)
    linux环境下NPM安装小结(淘宝镜像)
    Spark学习笔记
    导出HBase数据到Excel(Java代码)
    Spark通过JdbcRdd连接Oracle数据库(scala)
    基于AngularJS+Bootstrap的多文件上传与管理
    Hadoop-1.2.1 安装步骤小结(ubuntu)
    git-remote-https.exe 无法找到入口
  • 原文地址:https://www.cnblogs.com/jiangguanghe/p/3213397.html
Copyright © 2020-2023  润新知