Я работаю над приложением типа веб-краулер. Задача - быстро скачать много страниц. И вот я заметил что приложение качает Х страниц с примерно с одинаковой скоростью, вне зависимости от того сколько экземпляров запущено. Я написал тестовую программу:
Код | class Program { static string[] MakeLinks() { List<string> list = new List<string>(); string url = "http://apache.org?x=" + DateTime.Now.Ticks; // так боремся с кешированием for (int i = 0; i < 500; i++) { list.Add(url + "&y=" + i); // так боремся с кешированием } return list.ToArray(); }
static void B() { int c = 0; Stopwatch sw = new Stopwatch(); var links = MakeLinks(); List<Task<string>> tasks = new List<Task<string>>(); sw.Start(); foreach (string url in links) { Console.WriteLine(url); WebClient client = new WebClient(); tasks.Add(client.DownloadStringTaskAsync(url)); } foreach (var t in tasks) { t.Wait(); c += t.Result.Length; } sw.Stop(); Console.WriteLine("Downoaded {0} bytes. Download time: {1}", c, sw.Elapsed);
}
static void Main(string[] args) { B(); } }
|
Запустил один экземпляр, время работы от 55-60 сек. Запустил 3 экземпляры, время работы 55-65 сек. Шесть экземпляров - 70 секунд примерно. Тобишь, время скачивания мало зависит от колличества экземпляров приложения. Пожалуй можно было и еще запускать.
А это мне не очень подходит. Я предпочел бы чтоб один запущенный экземпляр употребил весь доступный интернет и выполнил работу за 5 секунд :( Вот, прошу совета... Что тут не так, как полностью нагрузить сеть из одного экземпляра приложения? |