Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
4 / 4 / 1
Регистрация: 12.06.2011
Сообщений: 111
.NET 4.x

Как оптимизировать код, где используется много методов .Contains?

22.04.2013, 08:06. Показов 3143. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть задача поиска всех url'ов на каком то сайте и найти в них битые/небитые. Задачу решил с использованием Selenium WebDriver. В его помощью я легко получаю все нужные мне ссылки. Но вот только после того, как страница сайта была загружена и из её кода были выдраны url'ы, мне нужно проверить, не обрабатывал ли я уже такую url'ку, нет ли её уже в каком нибудь списке. Для этого использую метод .Contains. Вот только использую аж 5 штук подряд) И получается ситуация, что страница уже загружена, а из-за моих проверок прога висит. Можно ли как то оптимизировать мой код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
static void Main(string[] args)
        {
            IWebDriver driver = new ChromeDriver();
            //----------------------------------------------
            
            ArrayList brokenLinks = new ArrayList();
            ArrayList workingLinks = new ArrayList();
            ArrayList visitedLinks = new ArrayList();
            ArrayList externalLinksToVisit = new ArrayList();
            Stack<string> internalLinksToVisit = new Stack<string>();
            bool needToStop = false;
            string domainName = "http://isokor.pinstudio.ru/";
            string url = string.Empty;
            string startUrl = string.Empty; 
            HttpWebRequest webRequest = null;
            HttpWebResponse response = null;
 
            internalLinksToVisit.Push(domainName);
 
            while (needToStop == false)
            {
                startUrl = internalLinksToVisit.Pop();
                driver.Navigate().GoToUrl(startUrl);
                visitedLinks.Add(startUrl);
 
                try
                {
                    webRequest = (HttpWebRequest)WebRequest.Create(startUrl);
                    webRequest.AllowAutoRedirect = false;
                    webRequest.Timeout = 5000;
 
                    response = (HttpWebResponse)webRequest.GetResponse();
                    Console.WriteLine(startUrl + " - " + ((int)response.StatusCode).ToString());
 
                    if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Moved && response.StatusCode != HttpStatusCode.MovedPermanently)
                    {
                        brokenLinks.Add(startUrl);
                    }
                    else
                    {
                        workingLinks.Add(startUrl);
                    }
                }
                catch (NotSupportedException)
                {
                    Console.WriteLine(startUrl + " - " + "невозможно определить код ответа");
                }
                catch (WebException e)
                {
                    brokenLinks.Add(startUrl + " - " + ((int)((HttpWebResponse)e.Response).StatusCode).ToString());
                    Console.WriteLine(startUrl + " - " + ((int)((HttpWebResponse)e.Response).StatusCode).ToString());
                }
                finally
                {
                    response.Close();
                }
 
                foreach (IWebElement element in driver.FindElements(By.TagName("a")))
                {
                    url = element.GetAttribute("href");
 
                    if (url != null)
                    {
                        if (url.Contains("#"))
                        {
                            continue;
                        }
 
                        if (internalLinksToVisit.Contains(url) == false && externalLinksToVisit.Contains(url) == false && visitedLinks.Contains(url) == false)
                        {
                            if (url.Contains(domainName) == true)
                            {
                                internalLinksToVisit.Push(url);
                            }
                            else
                            {
                                externalLinksToVisit.Add(url);
                            }
                        }
                    }
                }
 
                if (internalLinksToVisit.Count == 0)
                {
                    needToStop = true;
                }
            }
            
            //----------------------------------------------
 
            driver.Quit();
            Console.ReadKey();
        }
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.04.2013, 08:06
Ответы с готовыми решениями:

Код потребляет очень много памяти. Подскажите как оптимизировать?
Есть код на C++ (компилируется под GCC) - подсчёт коэффициентов осцилляторной системы методом Рунге-Кутта (метод в простейшем случае)....

Оптимизировать код парсинга страниц. Используется SimpleHtmlDom
Как оптимизировать подобное: $url2=('http://cайт1/'); $table2 = array(); $data2 = file_get_html($url2, false, $context); ...

Где научиться оптимизировать код?
Подскажите хорошие уроки, желательно на русском, по отладке ошибок ПХП, нахождение, исправление ошибок, ускорение работы сервера,...

30
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.04.2013, 20:17
Студворк — интернет-сервис помощи студентам
Vlad10, потоков столько, сколько ядер. Например, для i5 будет 4, для i7+HT будет уже 8, ну и т.д.

Насчет исключений: не знаю, смотреть надо.

Добавлено через 1 минуту
в AggregateException должно быть написано, какие исключения привели к нему. Смотрите на msdn и отладчик.
0
4 / 4 / 1
Регистрация: 12.06.2011
Сообщений: 111
22.04.2013, 20:21  [ТС]
И ещё насчёт форича: Разве это правильно - создавать новые объекты HttpWebResponse и HttpWebRequest? Может из-за этого вылезает ошибка?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.04.2013, 21:31
Vlad10, это локальные объекты, они невзаимосвязанны
0
4 / 4 / 1
Регистрация: 12.06.2011
Сообщений: 111
22.04.2013, 21:45  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Vlad10, это локальные объекты, они невзаимосвязанны
Я знаю, что не взаимосвязаны. Просто они создаются в каждой итерации, разве это не доп загрузка оперативки и доп время работы?
1
4 / 4 / 1
Регистрация: 12.06.2011
Сообщений: 111
22.04.2013, 22:28  [ТС]
Вот словил это исключение. Только что делать с ним не знаю. Получается, что при проверке какой то ссылки оно сваливается. Ладно, catcheм поймать можно, только как эту ссылку проверить, на которой он свалился?
Миниатюры
Как оптимизировать код, где используется много методов .Contains?  
0
4 / 4 / 1
Регистрация: 12.06.2011
Сообщений: 111
22.04.2013, 23:47  [ТС]
Он пишет типа, что ссылка на объект не указывает на экземпляр объекта. Фигня какая то. И в инете ничего толкового не нашёл, но у кучи людей именно в фориче такая лажа происходит.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.04.2013, 02:23
Цитата Сообщение от Vlad10 Посмотреть сообщение
Я знаю, что не взаимосвязаны. Просто они создаются в каждой итерации, разве это не доп загрузка оперативки и доп время работы?
Оптимизатор все равно их переместит куда ему будет выгоднее, а код пишется для человека. Так что нет, не доп.загрузка.

насчет ошибки: какую строчку подчеркивает студия когда вылетает?
0
4 / 4 / 1
Регистрация: 12.06.2011
Сообщений: 111
23.04.2013, 11:09  [ТС]
Дома он подчеркивал весь блок ForEach и писал, что объект не найден. Сейчас я запустил прогу на работе, в 1 раз он мне написал, что какая то непонятная ошибка изза оптимизации кода, потом тоже самое, потом что индекс какой то не найден в каком то массиве, а в 4 раз всё нормально. ААААААААААААААА, что за???
Если убрать паралельный форич, то всё ок. Что с ним такое? Почему он все время ошибки какие то вываливает непонятные?

На работе всё время сваливался тут:
catch (WebException e)
{
brokenLinks.Add(link + " - " + ((int)((HttpWebResponse)e.Response).Stat usCode).ToString());
Console.WriteLine(link + " - " + ((int)((HttpWebResponse)e.Response).Stat usCode).ToString());
}
0
4 / 4 / 1
Регистрация: 12.06.2011
Сообщений: 111
23.04.2013, 11:12  [ТС]
Вот, выловил:
Миниатюры
Как оптимизировать код, где используется много методов .Contains?  
0
4 / 4 / 1
Регистрация: 12.06.2011
Сообщений: 111
24.04.2013, 00:36  [ТС]
Кстати насчёт сортировки: http://professorweb.ru/my/csha... /12_12.php. Есть и класс SortedSet.
0
4 / 4 / 1
Регистрация: 12.06.2011
Сообщений: 111
25.04.2013, 16:13  [ТС]
Решил проблему. Вот какой должен быть код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 Parallel.ForEach(visitedUrls, visitedUrl =>
                {
                    HttpWebResponse response = null;
 
                    try
                    {
                        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(visitedUrl);
 
                        webRequest.AllowAutoRedirect = false;
                        webRequest.Timeout = 5000;
                        response = (HttpWebResponse)webRequest.GetResponse();
                        Console.WriteLine(i++.ToString() + ". " + visitedUrl + " - " + ((int)response.StatusCode).ToString() + " (" + response.StatusDescription + ")");
                        Console.WriteLine("Тип: " + response.ContentType);
 
                        if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Moved && response.StatusCode != HttpStatusCode.MovedPermanently)
                        {
                            brokenUrls.Add(visitedUrl);
                        }
                        else
                        {
                            workingUrls.Add(visitedUrl);
                        }
                    }
                    catch (NotSupportedException)
                    {
                        Console.WriteLine(visitedUrl + " - " + "невозможно определить код ответа");
                    }
                    catch (WebException e)
                    {
                        if (e.Status == WebExceptionStatus.ProtocolError)
                        {
                            brokenUrls.Add(visitedUrl + " - " + ((int)((HttpWebResponse)e.Response).StatusCode).ToString());
                            Console.WriteLine(i++.ToString() + ". " + visitedUrl + " - " + ((int)((HttpWebResponse)e.Response).StatusCode).ToString() + " (" + response.StatusDescription + ")");
                        }
                    }
                    finally
                    {
                        if (response != null)
                        {
                            response.Close();
                        }
                    }
                });
Проблема решена, всё работает довольно таки быстро. Ура!

Добавлено через 19 минут
Небольная поправка, вот такой:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Parallel.ForEach(visitedUrls, visitedUrl =>
                {
                    HttpWebResponse response = null;
 
                    try
                    {
                        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(visitedUrl);
 
                        webRequest.AllowAutoRedirect = false;
                        webRequest.Timeout = 5000;
                        response = (HttpWebResponse)webRequest.GetResponse();
                        Console.WriteLine(i++.ToString() + ". " + visitedUrl + " - " + ((int)response.StatusCode).ToString() + " (" + response.StatusDescription + ")");
                        Console.WriteLine("Тип: " + response.ContentType);
 
                        if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Moved && response.StatusCode != HttpStatusCode.MovedPermanently)
                        {
                            brokenUrls.Add(visitedUrl);
                        }
                        else
                        {
                            workingUrls.Add(visitedUrl);
                        }
                    }
                    catch (NotSupportedException)
                    {
                        Console.WriteLine(visitedUrl + " - " + "невозможно определить код ответа");
                    }
                    catch (WebException e)
                    {
                        if (e.Status == WebExceptionStatus.ProtocolError)
                        {
                            brokenUrls.Add(visitedUrl + " - " + ((int)((HttpWebResponse)e.Response).StatusCode).ToString());
                            Console.WriteLine(i++.ToString() + ". " + visitedUrl + " - " + ((int)((HttpWebResponse)e.Response).StatusCode).ToString() + " (" + ((HttpWebResponse)e.Response).StatusDescription + ")");
                        }
                    }
                    finally
                    {
                        if (response != null)
                        {
                            response.Close();
                        }
                    }
                });
Тему в общем то можно закрывать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.04.2013, 16:13

Как оптимизировать на чтение, если много оперативки?
Есть базы суммарным размером гиг 30. Есть сервер виртуальный с 60 гигами памяти. Как мне сделать так чтобы постгрес затолкал базы в память...

Много методов или много классов. Что лучше?
Имеется библиотека(ActiveX DLL), в которую, в своё время, было решено складировать функции, вызваемые извне(точнее, основным модулем)....

Конкатенация потребляет много памяти, как можно оптимизировать?
Конкатенация потребляет много памяти. Если учесть, что символ занимает 2 байта, то результирующая строка кода должна занимать около 20 МБ,...

Где и как используется оператор elseif?
//Лирическое вступление Изучая многие языки программирования, прихожу к выводу - что неопределенность это плохо. Неопределенность - это...

Используется много памяти
Здравствуйте! Недавно откатил Windows 8.1 на Windows 7. После установки новой винды, решил поставить по больше оперативки. Поставил 2...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru