2014-04-01 33 views
13

Muszę pobrać zawartość określonego adresu URL. Jest to proste i proste zadanie, chociaż chcę, aby było tak wydajne, jak to tylko możliwe.Czy HttpWebRequest lub Webclient są szybsze?

Czy WebClient lub HttpWebRequest zajmują mniej pamięci? Która klasa szybciej wykona to samo zadanie? Która klasa zajmuje mniej czasu do zainicjowania?

+1

"To zależy". Dlaczego nie spróbować i dowiedzieć się? Istnieją również różnice w łatwości użytkowania i możliwościach. –

+0

@JohnSaunders to tylko kwestia, która z nich jest szybsza. Szczerze mówiąc, nie wiem, jak dokładnie zmierzyć to, o czym wspomniałem w moich pytaniach. – niklon

+3

Jeśli nie możesz tego zmierzyć, nie musisz tego znać. Nie ma prostego pojęcia "szybszego". W najlepszym wypadku jest "szybciej w szczególnych okolicznościach". Zasadniczo, nie przedwcześnie optymalizuj. –

Odpowiedz

30

WebClient to tylko opakowanie około HttpWebRequest. Używanie wartości WebClient jest potencjalnie nieznacznie większe niż przy użyciu (tylko kilka milisekund). Ale ta "nieefektywność" ma ogromne zalety: wymaga mniej kodu, jest łatwiejsza w użyciu i mniej prawdopodobne jest popełnienie błędu podczas korzystania z niej. Weźmy na przykład pobieranie tekstu strony sieci Web przy użyciu WebClient:

var client = new WebClient(); 
var text = client.DownloadString("http://example.com/page.html"); 

Kontrast że do HttpWebRequest:

string text; 
var request = (HttpWebRequest)WebRequest.Create("http://example.com/page.html"); 
using (var response = request.GetResponse()) 
{ 
    using (var reader = new StreamReader(response.GetResponseStream())) 
    { 
     text = reader.ReadToEnd(); 
    } 
} 

Robi się naprawdę interesujące, jeśli chcesz, aby pobrać i zapisać do pliku. Z WebClient, jest to prosta sprawa z wywołaniem DownloadFile. Z HttpWebRequest musisz utworzyć pętlę do czytania itp. Liczba sposobów, w jakie można popełnić błąd przy użyciu HttpWebRequest, jest naprawdę zdumiewająca. Wiem, bo zrobiłem ich dużo.

Rozważ teraz pobranie dwóch różnych stron. Za pomocą WebClient można napisać:

var client = new WebClient(); 
var page1 = client.DownloadString(page1Url); 
var page2 = client.DownloadString(page2Url); 

Gotowe. W przypadku HttpWebRequest konieczne będzie skopiowanie powyższego kodu lub zawijanie go w metodzie. Ale jeśli masz zamiar opakować to w metodę, to dlaczego nie po prostu użyć WebClient, która już to robi dla ciebie?

Jeśli wziąć pod uwagę, że wniosek do szybkiej strony internetowej prawdopodobnie będzie rzędu od 100 do 500 milisekund, rzutnik niewielu milisekund że WebClient dodaje wyniesie co najwyżej jednocyfrowy procent całkowitego czasu .

Użyj WebClient do prostych rzeczy. Używaj tylko HttpWebRequest, jeśli potrzebujesz dodatkowego kontrolera niskiego poziomu, który oferuje. Uwagi dotyczące prędkości między tymi dwoma są nieistotne.

+0

Powiedziałbym, że różnica w wydajności jest rzędu mikrosekund, a nie milisekund. Dobra odpowiedź! – Loudenvier