Здравствуйте!
Возникла непонятная проблема - время работы подпрограммы зависит от способа
её вызова.
Она декодирует jpg, содержащийся в массиве и в другой массив записывает bmp,
это делается в цикле.
Если она находится в одном c-файле с тестовой вызывающей программой либо
вызывается из статически слинкованной библиотеки (libxxx.a), то выполняется
одинаково быстро, а если вызывается из libxxx.so, то работает на 35% дольше.
Конкретно 4.45ms и 6.03ms.
Если же я вызываю её из программы на Qt, для которой она и предназначена,
то работает существенно дольше. Программа получает jpg от видеокамеры и для
отдельной проверки я использовал одну из сохранённых картинок, картинка была
неподвижная, т.е. и рабочая программа и тестовая проверялись на одном и том же
изображении. В рабочей программе тоже цикл, время измерялось перед и сразу
после вызова подпрограммы.
В программе на Qt создаётся 4 объекта некоего класса для работы с видеокамерой,
из каждого из которых вызывается эта подпрограмма. Программа выполняется на
Intel Core 2 Quad, т.е. четырёхядерном процессоре.
Если подпрограмма вызывается из статически слинкованной библиотеки libxxx_cpp.a,
полученной отдельно от Qt вызовом g++, она выполнятся 6.0 - 6.2ms. В pro-файле
есть стрoки
CONFIG += static link_prl release
CONFIG += mmx sse sse2
т.е. ещё дольше, чем в программе на C при вызове из libxxx.so.
Если же я вставляю эту подпрограмму и всё, что ей надо, в саму программу на Qt,
в тот модуль, в котором она и вызывается, она выполняется ещё дольше -
7.0 - 7.2ms, а я думал, что будет быстрее.
Работа функций Qt, преобразующих полученный jpg в объект типа QImage,
занимает 5.6 - 6.3ms в зависимости от ядра.
Во всех случаях опции компилятора одни и те же при создании программ и библиотек.
1) Почему такая заметная разница при вызове из *.a и из *.so? Ладно бы несколько
процентов, а у меня 35.
2) Почему при вызове из программы на Qt подпрограмма работает намного дольше, чем
при вызове из тестовой программе на C?
В тестовой программе jpg содержался в unsigned char массиве, в программе на Qt
в QByteArray массиве, для доступа использовалась функция char* data() и
возвращаемое ею значение преобразовывалось к (unsigned char *).
3) Почему в программе на Qt при включении подпрограммы в сам проект, он состоит
из нескольких cpp-модулей, она выполняется дольше, чем при вызове из библиотеки?
Казалось бы, должно быть наоборот.
Если же создать только один объект, работающий с видеокамерой, то все
подпрограммы работают быстрее. Моя при вызове из библиотеки выполняется 4.95ms,
при включении в саму программу - 6.0ms, а функции Qt отрабатывают за 5.2ms.
И вообще что теперь делать и как жить дальше, если происходят такие вещи?
Пётр.