LINUX.ORG.RU

Qt и с++ для всего системного

 , ,


1

3

В свете последних новостей о Qt (и связанного с ней, или наоборот, С++) решил тут поделиться моим микро опытом.

Пишем сейчас одну программулину — читает данные с датчкиков по serial port, обрабатывает и шлет нужные команды. Вначале писал под плюсами с Qt+qserialport library. Пока скорость порта была 9600бод я особо не обращал внимание на «скорость» работы и обмена + тестировалось всё под каким-то коре2 (или даже квадом). Когда же запустил все это дело на Celeron 1800 + скорость 115200, то произошли неприятности: загрузка ЦПУ под 100%. Все торомзит и не шевелится (проц то одноядерный). Не понравилось мне все это, и переписал под pure C. Как результат — тежи самые действия на том же железе грузят ЦПУ на 10% (а не под 100%). Вот и не знаю, на что грешить: плюсы с их классами, кривость КуТэ в целом или на саму либу (хотя она вроде как офф, будет в кутэ 5 «изкоробки).

Зато получил ответ на вопрос, который иногда меня мучал (и будил по ночам): „Почему ядро Linux не перепишут под плюсы“.

Перемещено post-factum из talks

Ответ на: комментарий от trex6

P.S. У нас на арме 750 Мгц из четырех портов на 57600 программа все отлично читает, успевает обработать данные и выплюнуть на экран. Помимо чтения данных есть еще куча сложных мат.расчетов. Все летает.

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Да, рассматривал. Но дело в том, что там самого кода, который «делает дело» — раз и обчелся. Теже 50 строк, тот же смысл. Критично ошибиться там нереально.Но даже если предположить «криворукость» в этих 50 строках, но не на разницу же в 90%.

GreenBag ★★
() автор топика

Вот и не знаю, на что грешить: плюсы с их классами, кривость КуТэ в целом или на саму либу

Сразу видно профессиональный подход к разработке.

madgnu ★★★★★
()
Ответ на: комментарий от trex6

Вы используете в проекте плюсы как таковые или также Qt? И производите работу с серийником средствами Qt? Если да, то какой библиотекой пользуетесь?

GreenBag ★★
() автор топика

Без профилирования разговор бесполезен.

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от GreenBag

в 50 строках можно сделать более ста логических и синтаксических ошибок. Так что нечего на зеркало пенять коль рожа крива.

Jetty ★★★★★
()
Последнее исправление: Jetty (всего исправлений: 1)
Ответ на: комментарий от Jetty

Я не говорю о синтаксических ошибках. Да и код не совсем кривой. Хотя признаюсь, что без прямых сравнений кода, конечно, сложно определить что и к чему. Но просто эти 90% прироста порадовали очень.

GreenBag ★★
() автор топика

Кэп подсказывает, что если ты юзал qserialport и с его заменой на велосипед ситуация исправилась, то дело или в qserialport, или в том, как ты его юзал.

Pavval ★★★★★
()
Последнее исправление: Pavval (всего исправлений: 1)

уже сказали - профайлер в руки и смотреть, 99.99% за то, что ты сам напортачил в коде

wota ★★
()
Ответ на: комментарий от Pavval

Да, я тоже более склонен грешить на саму библиотеку. Но других, увы, нет. Залез я ради интереса во внутренности этой библиотечки, увидел что там практически «теже Фаберже, только в профиль» (select'ы и прочие) и особо далее не углублялся.

GreenBag ★★
() автор топика
Ответ на: комментарий от stevejobs

Признаюсь, что профайлером пока не прогонял (какой, кстати, лучше использовать, gprof?).

GreenBag ★★
() автор топика

у нас для

uname -a
Linux 192.168.1.56 2.6.27.8 #107 PREEMPT Thu Aug 9 10:15:08 YEKT 2012 armv5tejl unknown

# cat /proc/meminfo
MemTotal:        61676 kB
MemFree:         56544 kB

cat /proc/cpuinfo
Processor       : ARM926EJ-S rev 4 (v5l)
BogoMIPS        : 107.52
Features        : swp half thumb fastmult vfp edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant     : 0x0
CPU part        : 0x926
CPU revision    : 4
Cache type      : write-back
Cache clean     : cp15 c7 ops
Cache lockdown  : format C
Cache format    : Harvard
I size          : 32768
I assoc         : 4
I line length   : 32
I sets          : 256
D size          : 32768
D assoc         : 4
D line length   : 32
D sets          : 256

Hardware        : Phytec 3250 board with the LPC3250 Microcontroller
Revision        : 0000
Serial          : 0000000000000000

на кутях написана программа, которая рулит кучей измерений, и ничего не тормозит. видимо ты что-то делаешь не так.

ymn ★★★★★
()
Ответ на: комментарий от GreenBag

В проекте используется C++/Qt. Порты читаем напрямую.
Если Inbiza Labs сделали кривую библиотеку, то не надо по этому поводу гнать на ++ и Qt.

trex6 ★★★★★
()

«Почему ядро Linux не перепишут под плюсы?».

Чтобы те, кто задает эти вопросы не прикасались к разработке ядра.

AiFiLTr0 ★★★★★
()
Ответ на: комментарий от AiFiLTr0

Кстати, да. Слыхал об epoll, но подзабыл. Таки попробую и этот метод. Благодарю.

GreenBag ★★
() автор топика
Ответ на: комментарий от Pavval

Этому коду уже 3 года, если не больше. Работает хорошо, так что шансов на рефакторинг у него практически нет.

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Не, я просто скорее ТСу, что если ему проще заюзать QIODevice, то он не проиграет по сравнению с чистыми read/open.

Pavval ★★★★★
()

Вот и не знаю, на что грешить: плюсы с их классами, кривость КуТэ в целом или на саму либу (хотя она вроде как офф, будет в кутэ 5 «изкоробки).

На кривые руки не пробовал грешить?

„Почему ядро Linux не перепишут под плюсы“.

что бы было?!

erfea ★★★★★
()

Вот и не знаю, на что грешить: плюсы с их классами, кривость КуТэ в целом или на саму либу

это наивно так полагать что раз ты не смог осилить и грамотно прочитать документацию, отладить проблему в ТВОЕМ коде, то значит Qt и C++ не годны

выводы делай

I-Love-Microsoft ★★★★★
()

Не понравилось мне все это, и переписал под pure C

Вот если бы вы сообщили что конкретно удаляли и на что конкретно меняли, тогда можно было сказать. Потому как вы могли компилить под C++, но его функционала не использовать. А так мы сравниваем сферического коня и сферическую кобылу в вакууме.

И, кстати, если скомпилить с помощью с++ вашу С-шную прогу, тоже летает? А если вернуть весь C++ - specific код, но использовать С-шную библиотеку QT? может дело в QT библиотеке, может в C++ компиляторе, может в специфических конструкциях C++.

Анализ, нужен анализ: локализировать проблему нужно, а только потом думать что с ней делать.

Kroz ★★★★★
()
Ответ на: комментарий от GreenBag

попробуй тот же oprofile или valgrind, сразу поймешь в чем проблема, или gperftools, да даже gprof если у тебя один поток в программе

неужели это так сложно применить профилировщик? я думал раньше что это трудно, но оказалось просто, особенно valgrind

так что смело читай что такое профилировка и найдешь причины в своем коде на счет раз

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Плюсую валгринд.
Тем более, что из последних QtCreator работать с ним - одно удовольствие.

trex6 ★★★★★
()
Ответ на: комментарий от Pavval

QIODevice кстати, не особо тормозной, так что можно и его.

QIODevice - абстрактный интерфейс. Как вы собираетесь его юзать? :}

anonymous
()
Ответ на: комментарий от nanoolinux

Согласен, выглядит как говно:

if (ev->events & EPOLLIN)
  { // отступ 2, новый блок на новой строке
   if (us->tag != prev_tag) { // if - отступ 1, новый блок на текущей строке
   printf("[%d bytes]\n", count); // отступ 0
   count=0;
   frametimer_update();
   printf("[%f\t] %s:\t",frametimer_since(0), us->tag); 
   prev_tag=us->tag;
   } 
   while (count!=-1)
     { // отступ 2, новый блок на новой строке
       count = read(us->fd, buf, 8);
       for (i=0;i<count;i++){ // нет пробела, новый блок на текущей строке
	printf(" 0x%hhx",buf[i]); // табы вместо пробелов
	bytes++;
       }
       fflush(stdout);
     }
Код явно писался на коленке, no consistency at all.

anonymous
()

Почему ядро Linux не перепишут под плюсы

Linus

C++ is a horrible language. It's made more horrible by the fact that a lot of substandard programmers use it, to the point where it's much much easier to generate total and utter crap with it. Quite frankly, even if the choice of C were to do *nothing* but keep the C++ programmers out, that in itself would be a huge reason to use C.

schizoid ★★★
()
Ответ на: комментарий от anonymous

Это писалось под задачу за 30 минут c использованием gedit вместо редактора на чужой машине, что ты хочешь? Будет время - поправлю кодинг стайл. А пока работает - и хрен бы с ним.

AiFiLTr0 ★★★★★
()
Ответ на: комментарий от AiFiLTr0

Если зело раздражает, натрави astyle или сделай C-x h C-\

AiFiLTr0 ★★★★★
()
Ответ на: комментарий от AiFiLTr0

Да там кода-то с гулькин клюв. Мог бы и причесать, раз выложил на гитхаб, да ещё и с лицензией (понты-понты)

anonymous
()
Ответ на: комментарий от anonymous

Хорошо анон, форкни добавь блэкджек, шлюх и форматирование. Разрешаю. И не забудь скопировать текст GPL в файл COPYING. Мне было лень.

AiFiLTr0 ★★★★★
()

Зато получил ответ на вопрос, который иногда меня мучал (и будил по ночам): «Почему ядро Linux не перепишут под плюсы».

Лучше поздно, чем никогда.©

Deleted
()
Ответ на: комментарий от Gorthauer

1. Что за либа?
2. Зачем она мне, если у меня свое решение, протестированное вдоль и поперек, работает на ура.

trex6 ★★★★★
()

Что-то у меня на говенном атоме qextserialport на 115200 спокойно туда-сюда данные гоняет и проц не грузит, наверное, у меня неправильные Qt и g++....

Kosyak ★★★★
()
Ответ на: комментарий от GreenBag

А ссылку на либу не дадите?

http://qt-project.org/wiki/QtSerialPort_Russian

Хотя еще имеются небольшие проблемы. В Виндах на некоторых USB/Serial контроллерах проявляется высокая загрузка на процессор.

Баг тут https://bugreports.qt-project.org/browse/QTPLAYGROUND-2

Сейчас идет усиленное пиление либы, грядет полная смена архитектуры потрохов.

Предварительно ознакомится и протестить примерный будущий вариант можно отсюда:

https://codereview.qt-project.org/#change,32186

В принципе, это уже дало результаты:

http://qt-project.org/forums/viewthread/18580/P15

Так что, кому не безразлично наличие поддержки последовательных портов - милости просим к сотрудничеству жителей Л.О.Р а. :)

kuzulis ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.