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%就算是很好的成绩了。。。

  • 相关阅读:
    分布式
    pytest+allure+jenkins
    Pytest-参数化和unittest-ddt的对比(两种数据驱动的对比)
    pytest- fixture个人理解总结
    os路径拼接时,比如os.path.join(base_dir,"Outputslogs")后半段斜杠请小心被识别为转义字符,所以请用/,因为windows都能识别到此路径。
    python中如何获取当前时间,并计算时间差
    Web UI自动化测试-滚动条操作
    java 基础 1.什么是Java?2.Java语言的特点?
    java 排序3 插入排序
    java 排序2 冒泡排序
  • 原文地址:https://www.cnblogs.com/LouisGuo/p/4664991.html
Copyright © 2011-2022 走看看