单线程,多线程,线程池效率问题

任务要求:发送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%就算是很好的成绩了。。。

原文地址:https://www.cnblogs.com/LouisGuo/p/4664991.html