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