Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
 Аватар для pincet
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910

Исключения безбожно отнимают ресурсы процессора?

03.07.2012, 16:37. Показов 2084. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот такой код (тело потока Thread), отнимает 60-70% ресурсов процесса (Intel Core 2 Duo, 2,53)
подозреваю - исключения сокета, работа в потоке. Где правда?
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
        public void proc(Int16 no, string IP, Int32 Port)
        {
            Socket soc = new Socket(AddressFamily.InterNetwork,
                                    SocketType.Stream,
                                    ProtocolType.Tcp);
            Reaction rea = new Reaction(DataBasePath);
            int Tick = System.Environment.TickCount;
            byte n; bool opened = false;
            byte[] recv = new byte[255];
            string[] parse;
            string mess;
            while (HOST.MyInf[no]._act)
            {
                try
                {
                    if (!opened)
                    {
                        soc.Connect(IP, Port);
                        soc.Blocking = false;
                        opened = true;
                    }
 
                    if (HOST.MyInf[no]._Command)
                    {
                        HOST.MyInf[no]._Command = false;
                        soc.Send(HOST.MyInf[no]._info);
                    }
                    if (System.Environment.TickCount - Tick > HeartBeatTick)
                    {
                        Tick = System.Environment.TickCount;
                        //HOST.MyInf[no]._info = Encoding.ASCII.GetBytes("\x02(66\t17\t5\t18\t1\x03"); // HeartBeat Request
                        HOST.MyInf[no]._info = Encoding.ASCII.GetBytes(".r.282.2\x0d\x0a"); // CPU Usage for 52209
                        soc.Send(HOST.MyInf[no]._info);
                       
                    }
                    n = (byte)soc.Receive(recv);
                    if (n > 0)
                    {
                        parse = Encoding.GetEncoding(1251).GetString(recv, 1, n - 2).Split('\t'); 
                        mess = no.ToString();
                        if (parse[0] != "5" ) // сообщения "5" - HeartBeat Response
                        {
                            switch (parse[0])
                            {
                                case "44":
                                    switch (parse[1])
                                    {
                                        case "1": 
                                            HOST.SQue.Enqueue(rea.GetEmployee(parse[2].ToString()));
                                            SetCommand(no, "(44\t1\t" + rea.GetEmployee(parse[2].ToString()));
                                        break;
                                        case "2": 
                                            HOST.SQue.Enqueue(no + ",44," + parse[2].ToString());
                                        break;
                                    }
 
                                 break;
                                default:
                                    foreach (string ss in parse) mess = mess + "," + ss;
                                    HOST.SQue.Enqueue(mess);
                                break;
                            }
                            Array.Clear(parse, 0, parse.Length); 
                        } 
                    }
                } //try
                catch (SocketException se)
                {
                    if (!se.ErrorCode.Equals(10035))
                    {
                        HOST.MyInf[no]._act = false;
                        HOST.SQue.Enqueue(no.ToString() + ",66," + se.ErrorCode.ToString()); // отвалилсо ошибка 66
                        soc.Close();
                        opened = false;
                    }
                } //catch
                catch (IndexOutOfRangeException Oute)
                {
                    HOST.evt.ExternalEvent("Ext1", "", "");
                }
 
                catch (Exception ee)
                {
                    HOST.evt.ExternalEvent("Ext - exc", "", ee.Message);
                }
            } // while
            if (opened)
            {
                soc.Close();
                HOST.SQue.Enqueue(no.ToString() + ",02"); 
            }
 
        } // Proc stream
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2012, 16:37
Ответы с готовыми решениями:

Miner.exe потребляет ресурсы процессора 100%
Здравствуйте, при включение компьютера обнаружил, что не запускаются некоторые приложения. В диспетчере задач увидел что некий процесс...

Как организовать задержку в 5 мс, которая не занимает ресурсы процессора?
Мне надо организовать задержку в 5 мс, которая не занимает ресурсы процессора. После долгих экспериментов выяснил, что функция API Sleep...

Oracle 11g поедает все ресурсы процессора странным образом
Всем здравствуйте. У меня такая проблема. С Oracle уже год рука об руку, но ни как не могу справиться с проблемой производительности...

14
123 / 121 / 6
Регистрация: 21.12.2011
Сообщений: 348
03.07.2012, 16:59
pincet, заноси в блоки try {} catch() только те операции, которые могут кинуть exception, а не все подряд как у тебя.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.07.2012, 18:23
Создание исключения, конечно, процедура не из дешевых, но не настолько чтобы забивать процессор.
У вас там кроме исключений всякой вуду-магии полно, которая тормозить может.
0
 Аватар для pincet
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
03.07.2012, 18:32  [ТС]
Цитата Сообщение от Savvy Посмотреть сообщение
pincet, заноси в блоки try {} catch() только те операции, которые могут кинуть exception, а не все подряд как у тебя.
Оно то так, но исключения кидает только сокет (ошибка 10035) . Сокет неблокирующий. Исключение будет возникать раз за разом.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.07.2012, 18:37
pincet, проведите простой эксперимент: создайте новое консольное приложение и в главном методе пропишите примерно такой код:
C#
1
2
3
4
5
while (true)
{
   try { int.Parse("wtf"); }
   catch { }
}
Потом запустите и посмотрите на нагрузку процессора. Будет 60-70%?

Можно добавить несколько вложенных методов - время создания исключения пропорционально размеру стека вызова.
0
 Аватар для pincet
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
03.07.2012, 18:43  [ТС]
печаль в том, что данные из сокета приходят нечасто. Соответсвтенно и Parse() также. А проц нагружается сразу после Thread.Start()
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.07.2012, 18:47
Цитата Сообщение от pincet Посмотреть сообщение
печаль в том, что данные из сокета приходят нечасто. Соответсвтенно и Parse() также. А проц нагружается сразу после Thread.Start()
Ну так вывод прост: загрузка процессора не связана с исключениями.
0
 Аватар для pincet
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
03.07.2012, 18:55  [ТС]
не совсем. сокет неблокирующий. Исключение 10035 кидает постоянно. На это грешу. Или ошибочно?

Добавлено через 5 минут
Цитата Сообщение от kolorotur Посмотреть сообщение
Потом запустите и посмотрите на нагрузку процессора. Будет 60-70%?
90% загрузки проца.
сейчас код собрал в C#Develop 3.2. Ранее- VS 2005
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.07.2012, 19:00
А, ну так исключение все-таки постоянно бросается.
Попробуйте убрать весь код из обработчика исключения и посмотрите - упадет ли нагрузка.
0
 Аватар для pincet
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
03.07.2012, 19:21  [ТС]
убрать из обработчика чтение из неблокирующего сокета - никак, винда заорет на необработанное исключение. Придется, видно, использовать асинхронные сокеты. Использовать блокирующий - тоже не айс вроде, теряем соединение. Сейчас оправляю т.н. "Heartbeat Request" время от времени. Девайс отвечает - соединение не рвется

Добавлено через 2 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
Попробуйте убрать весь код из обработчика исключения и посмотрите - упадет ли нагрузка.
Сорри, невнимательно прочитал. Попробую. Но это не выход - мне необходимо сообщить клиенту, что соединение разорвано, закрыть соединение, создать условия для окончания потока.

Добавлено через 6 минут
короче, печаль. 3 экземпляра кода,
C#
1
2
3
4
5
while (true)
{
   try { int.Parse("wtf"); }
   catch { }
}
пропорционально отжирают почти все 100% проца.
0
123 / 121 / 6
Регистрация: 21.12.2011
Сообщений: 348
03.07.2012, 19:25
pincet, валится на строках soc.Send() ?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.07.2012, 23:18
Цитата Сообщение от pincet Посмотреть сообщение
Но это не выход
Так я и не предлагаю совсем убрать. Для начала надо изолировать нагружающий ЦПУ код, а потом уже устранять это узкое место.

Попробуйте заменить ловлю исключения проверкой на наличие соединения.
0
 Аватар для pincet
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
04.07.2012, 09:37  [ТС]
так проблема в том, что исключение возникает не только при отсутствии соединения, но и (т.к. сокет неблокирующий) при отсутствии данных в канале (исключение 10035)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.07.2012, 10:44
Цитата Сообщение от pincet Посмотреть сообщение
исключение возникает не только при отсутствии соединения, но и (т.к. сокет неблокирующий) при отсутствии данных в канале
Так а зачем "ломиться" в канал с целью считывания, не зная, имеются ли там данные?
У класса Socket есть свойство Available, которое возвращает количество готовых к считыванию данных. Сделайте перед считыванием проверку: если значение равно 0, то считывать не надо, а то словите исключение.

Как-то так:
C#
1
2
3
4
5
if (soc.Available > 0)
{
   n = (byte)soc.Receive(recv);
   ...
}
1
 Аватар для pincet
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
04.07.2012, 12:51  [ТС]
Ларчик просто открывался?
Добавил в тело потока ожидание
C#
1
 System.Threading.Thread.Sleep(500);
и все взлетело. Вот только как оптимально подобрать задержку?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.07.2012, 12:51
Помогаю со студенческими работами здесь

две кнопки - клики по которым прибавляют или отнимают
Привет разработчикам, помогите написать функцию.. которая будет переключать страницы.. Есть две кнопки вперёд и назад. В одном случаи...

Тормозит безбожно интернет
Друзья, выручите пожалуйста. Упала скорость тырнета. Укртелеком (провайдер) говорит у них всё ок, проблема у меня. Логи приложил. Спасибо...

Машина Тьюринга, отнимают от числа число 5, если получается меньше нуля, тогда добавляют 5
Построить МТ и НАМ, которые отнимают от числа число 5, а если получается меньше нуля, тогда добавляют 5. Помогите пожалуйста(

безбожно тупит 620 д-линк
Покупал его около года назад. Не понравился сразу. Кое-как с фтп д-линка перепрошил его. Стал работать более-менее. Сейчас начал виснуть,...

Вирус. тормозит комп безбожно!
Доброго дня, нужна помощь, вирус на компе не дает работать, забивается оперативная память. Помогите пожалуйста


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru