odenのメモ帳

いっつも解決したことを書き留めなくて,後々後悔するので,それを防ごうプロジェクト

C#でのHTML取得方法を比較した

C#でWebページの内容を取得する方法はいくつかあるが,どれが速いのかよく分からなかったのでテキトーに調べてみた.計測とか調べ方はチョー適当なので参考程度に.

今回確かめたC#でWebページの内容を取得するクラスは

  • WebClientクラス
  • WebRequestクラス
  • HttpClientクラス

である.

というかC#でHTMLを取得するいい方法を誰かおしえてください.

計測結果

クラス 時間(秒)
WebClient 3.279
WebRequest 4.741
HTTPClient 4.081

今回,あるURLのHTMLを50回取ってくるという操作の10回平均を計測した.

今回計測した所WebClientが一番速いという結果になったが,HTTPClientクラスは非同期対応とか各クラスで特徴あるので使い分けましょうということで.
なお下記コードでProxyをnullにしているのは,そうした方が速いらしいからである.

追記

using使ってないクソダサコードだけど許して

コード

using System;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO;
using System.Net.Http;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            // 時間計測用のタイマー
            var timer = new System.Diagnostics.Stopwatch();
            timer.Start();
            for (int k = 0; k < 10; k++)
            {
                for (int i = 0; i < 50; i++)
                {
                    string URL = "hogehoge";

                    ///ここを適宜変更
                    string temp = getHTML(URL);
                    ///
                }
            }
            
            timer.Stop();
            Console.WriteLine("{0:0.000}秒", timer.Elapsed.TotalSeconds/10);
            Console.Read();
        }



        static string getHTML(string url)
        {
            WebRequest wr = WebRequest.Create(url);
            wr.Timeout = 10000;
            HttpWebRequest pcHttpRec = (HttpWebRequest)wr;
            pcHttpRec.Proxy = null;

            Encoding enc = Encoding.GetEncoding("UTF-8");
            string result = "";
            using (Stream st = wr.GetResponse().GetResponseStream())
            using (StreamReader sr = new StreamReader(st, enc))
            {
                result = sr.ReadToEnd();
            }
            return result;
        }

        static string getHTML2(string url)
        {
            Uri webUrl = new Uri(url);
            Task<string> webTask = GetWebPageAsync(webUrl);
            webTask.Wait();
            string result = webTask.Result;
            return result;
        }

        static string getHTML3(string url)
        {
            WebClient wc = new WebClient();
            wc.Encoding = Encoding.UTF8;
            wc.Proxy = null;
            Stream st = wc.OpenRead(url);

            Encoding enc = Encoding.GetEncoding("UTF-8");
            StreamReader sr = new StreamReader(st, enc);
            string html = sr.ReadToEnd();
            sr.Close();

            st.Close();
            return html;

        }

        static async Task<string> GetWebPageAsync(Uri uri)
        {
            // HttpClientHandlerにProxy情報を設定する
            HttpClientHandler ch = new HttpClientHandler();
            ch.Proxy = null;
            using (HttpClient client = new HttpClient(ch))
            {
                // タイムアウトをセット(オプション)
                client.Timeout = TimeSpan.FromSeconds(10.0);
                return await client.GetStringAsync(uri);
            }
        }
    }
}