Neuroware
@Neuroware
Программист в свободное от работы время

Как оптимизировать Serial.WriteLine?

Есть функция, которая получает данные из очереди и отправляет их на COM порт. этот поток 100% времени занимается отправкой данных (строки по 16 символов), по 1 за раз. COM работает на максимально доступной ему скорости (115тыс), все бы ничего, но эта функция очень сильно отжирает ЦП, на моем 4х ядерном Феноме легко съедает 30%ЦП, как по мне эта функция довольно примитивная (отправка данных) и не должна так сильно есть ЦП, можно ли ее как либо оптимизировать?

Queue sd = new Queue();
        void Sender()
        {
            Serial.WriteLine((string)sd.Dequeue());
        }
  • Вопрос задан
  • 2337 просмотров
Решения вопроса 2
@Oxoron
Шарпер
Вижу два возможных затыка.
1. В методе отсылается лишь одно сообщение. Значит, метод вызывается порядка 115 тысяч раз в секунду (не уверен, что правильно назвал цифру, но суть понятна). Можно замерить число сообщений в очереди, и передать его методу Sender(). Получится
void Sender(int messageQty)
        {
                for(int i=0; i< messageQty; i++)
                {
                        Serial.WriteLine((string)sd.Dequeue());
                }               
        } // Интересно, вызовы Dequeue можно избежать? Каким-нибудь foreach или другой структурой? Или они вообще не фатальны?


2. У вас есть каст к строке, (string)sd.Dequeue(). Он тоже отжирает время. Если есть возможность, используйте Queue<string>. Как вариант, можете попробовать использовать sb.Dequeue().ToString()
Ответ написан
Комментировать
Neuroware
@Neuroware Автор вопроса
Программист в свободное от работы время
Всем спасибо за помощь, убрал холостые циклы, отказался от асинхронности вызова, убрал очередь и загрузка снизилась до 5%
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@mayorovp
Не нравится мне вот эта строчка: Serial.WriteLine((string)sd.Dequeue());
Вы как проверяете, что в очереди sd вообще что-то есть?

Покажите больший кусок программы, там наверняка у вас активное ожидание.
Ответ написан
@Eddy_Em
Подозреваю, что если это напрямую на регистрах написать, то никаких проблем не будет!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы