我正在使用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);
}
}
我不会责怪QLibrary
:func
第一次调用它只需要很长时间。我敢打赌,如果您使用特定于平台的代码解析其地址,您将获得相同的结果,例如dlopen
和dlsym
在 Linux 上。 除了包装平台 API 之外,QLibrary
并没有做太多事情。没有什么特定的内容会使第一次调用变慢。
在大概是泛型类的构造函数中执行文件 I/O 有一些代码气味:类的用户是否知道构造函数可能会阻塞磁盘 I/O,因此理想情况下不应从 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";
}
}
};