QLibrary функции работают медленно при первом вызове

Я использую QLibrary для загрузки функций из одного DLL-файла.
Я успешно загружаю его, успешно решаю функции.
Но когда я впервые использую какую-то функцию из этого .dll, эта функция работает очень медленно (даже если она очень простая). В следующий раз я использую его снова — и скорость просто отлично (сразу, как и должно быть).

В чем причина такого поведения? Я подозреваю, что кто-то куда-то зашел

Изменить 1: Код:

typedef int(*my_type)(char *t_id);
QLibrary my_lib("Path_to_lib.dll");
my_lib.load();
if(my_lib.isLoaded){
my_type func = (my_type)my_lib.resolve("_func_from_dll");
if(func){
char buf[50] = {0};
char buf2[50] = {0};
//Next line works slow
qint32 resultSlow = func(buf);
//Next line works fast
qint32 resultFast = func(buf2);
}
}

1

Решение

Я бы не стал винить QLibrary: func просто занимает много времени в первый раз, когда он вызывается. Могу поспорить, что у вас будут идентичные результаты, если вы разрешите его адрес с помощью кода для конкретной платформы, например dlopen а также dlsym в линуксе QLibrary на самом деле ничего особенного, кроме обертывания API платформы. Там нет ничего конкретного, что сделало бы первый звонок медленным.

Есть некоторый запах кода при выполнении файлового ввода-вывода в конструкторах предположительно универсальных классов: знают ли пользователи класса, что конструктор может блокировать дисковый ввод-вывод и, следовательно, в идеале не должен вызываться из потока GUI? Qt делает выполнение этой задачи асинхронно довольно простым, поэтому я, по крайней мере, постараюсь быть таким хорошим:

class MyClass {
QLibrary m_lib;
enum { my_func = 0, other_func = 1 };
QFuture<QVector<FunctionPointer>> m_functions;
my_type my_func() {
static my_type value;
if (Q_UNLIKELY(!value) && m_functions.size() > my_func)
value = reinterpret_cast<my_type>(m_functions.result().at(my_func));
return value;
}
public:
MyClass() {
m_lib.setFileName("Path_to_lib.dll");
m_functions = QtConcurrent::run{
m_lib.load();
if (m_lib.isLoaded()) {
QVector<QFunctionPointer> funs;
funs.push_back(m_lib.resolve("_func_from_dll"));
funs.push_back(m_lib.resolve("_func2_from_dll"));
return funs;
}
return QVector<QFunctionPointer>();
}
}
void use() {
if (my_func()) {
char buf1[50] = {0}, buf2[50] = {0};
QElapsedTimer timer;
timer.start();
auto result1 = my_func()(buf1);
qDebug() << "first call took" << timer.restart() << "ms";
auto result2 = my_func()(buf2);
qDebug() << "second call took" << timer.elapsed() << "ms";
}
}
};
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]