首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QLibrary函数在第一次调用时运行缓慢

QLibrary函数在第一次调用时运行缓慢
EN

Stack Overflow用户
提问于 2018-09-03 21:18:08
回答 1查看 218关注 0票数 2

我使用QLibrary从一个.dll文件加载函数。我成功地加载了它,成功地解析了函数。但是当我第一次使用该.dll中的某些函数时,该函数的运行速度非常慢(即使它非常简单)。下一次我再次使用它--速度很好(立即,正如它应该的那样)。

这种行为的原因是什么?我怀疑在什么地方有一些caсhing。

编辑1:代码:

代码语言:javascript
复制
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);
  }
}
EN

回答 1

Stack Overflow用户

发布于 2018-09-05 03:16:48

我不会责怪QLibraryfunc只是在第一次调用时需要很长时间。我敢打赌,如果你使用特定于平台的代码来解析它的地址,比如Linux上的dlopendlsym,你会得到相同的结果。除了包装平台应用程序接口之外,QLibrary实际上并没有做太多的事情。没有任何特定的东西会使第一次调用变慢。

假设泛型类的构造函数中有一些执行文件I/O的代码味道:类的用户是否知道构造函数可能在磁盘I/O上阻塞,因此理想情况下不应该从GUI线程调用?Qt使得异步完成这项任务变得相当容易,所以我至少会试着这样做:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52150584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档