zoukankan      html  css  js  c++  java
  • 单线程,多线程,线程池效率问题

    任务要求:发送50次http请求,把获取到的结果保存在本地文件中

    任务代码:

    public static void GetXML(object obj)
            {
                XMLVar xv = obj as XMLVar;
    
                string path = xv.Path;
                string url = xv.Url;
                
                
                HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
                req.Timeout = 1000 * 1000;
                req.Method = "GET";
                
                //req.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36";
                using(WebResponse res = req.GetResponse())
                {
                    using (Stream stream = res.GetResponseStream())
                    {
                        byte[] by = new byte[1024];
                        using(MemoryStream ms=new MemoryStream())
                        {
                            while (true)
                            {
                                int readed = stream.Read(by, 0, by.Length);
                                if (readed == 0)
                                {
                                    break;
                                }
                                ms.Write(by, 0, readed);
                            }
    
                            using(FileStream fs = new FileStream(path, FileMode.Create))
                            {
                                fs.Write(ms.ToArray(), 0, ms.ToArray().Length);
                            }
    
                        }
                    }
                }
    
            }

    自定义类XMLVar:

    class XMLVar
        {
            public string Path { get; set; }
            public string Url { get; set; }
        }

    测试代码:

    单线程:

    Stopwatch sw = new Stopwatch();
                sw.Start();
    
                for (int i = 0; i < 50; i++)
                {
                    string path = String.Format("D:\xml\{0}.xml", i);
                    string url = "http://feed.cnblogs.com/blog/sitehome/rss";
    
                    GetXML(new XMLVar() { Path = path, Url = url });
    
    
                }
    
    
                sw.Stop();
    
    
                Console.WriteLine(sw.ElapsedTicks);

    多线程:

    Stopwatch sw = new Stopwatch();
                sw.Start();
    
                List<Thread> tList = new List<Thread>();
    
                for (int i = 0; i < 50; i++)
                {
                    string path = String.Format("D:\xml\{0}.xml", i);
                    string url = "http://feed.cnblogs.com/blog/sitehome/rss";
                    Thread t = new Thread(GetXML);
                    t.Start(new XMLVar() { Path = path, Url = url });
                    tList.Add(t);
    
                }
    
                foreach (var item in tList)
                {
                    item.Join();
                }
    
                sw.Stop();
    
    
                Console.WriteLine(sw.ElapsedTicks);

    线程池:

    Stopwatch sw = new Stopwatch();
                sw.Start();
    
                for (int i = 0; i < 50; i++)
                {
                    string path = String.Format("D:\xml\{0}.xml", i);
                    string url = "http://feed.cnblogs.com/blog/sitehome/rss";
                }
    
    
    
                while (true)
                {
                    Thread.Sleep(1 * 1000);
                    ThreadPool.GetMaxThreads(out maxWorker, out maxIO);
    
                    ThreadPool.GetAvailableThreads(out avaWorker, out avaIO);
    
                    if (maxWorker == avaWorker)
                    {
                        sw.Stop();
                        break;
                    }
    
                }
    
                Console.WriteLine(sw.ElapsedTicks);

    最终结果:

    单线程:335007825

    多线程:274266611

    线程池:288887602
     

    可见,多线程对效率的提升极其微小,果然培训时说最多能提升10%就算是很好的成绩了。。。

  • 相关阅读:
    MySQL 锁的监控及处理
    mssql sqlserver 不固定行转列数据(动态列)
    SQL常用增删改查语句--来源于网络
    mssql sqlserver 对不同群组对象进行聚合计算的方法分享
    mssql sqlserver 自动备份存储过程的方法分享
    mssql sqlserver updatetext关键字应用简介说明
    mssql sqlserver 将字段null(空值)值替换为指定值的三种方法分享
    mssql sqlserver with cte表达式(递归)找出最顶值的方法分享
    mssql sqlserver text数据类型专题说明
    mssql sqlserver 使用sql脚本 清空所有数据库表数据的方法分享
  • 原文地址:https://www.cnblogs.com/LouisGuo/p/4664991.html
Copyright © 2011-2022 走看看