在 Visual Studio 外部启动时程序运行速度较慢

2024-04-07

我注意到我的程序有一些奇怪的行为。我使用 Visual Studio Professional 2013 Update 1 用 C++ 编写它,它由一个 exe 应用程序组成,该应用程序链接多个 DLL 并调用这些 DLL 中定义的函数。

在我的主程序(由数千行代码组成)中,我调用了一个 DLL 函数(我们称其为DLLFunction())然后我计算该调用所花费的时间,如下所示:

auto beginTime = std::chrono::high_resolution_clock::now();

DllFunction();

auto endTime = std::chrono::high_resolution_clock::now();

long long totalTime = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();

我注意到,在 Visual Studio 之外启动它需要更长的时间。例如:

运行它debug在带有附加调试器的 Visual Studio 中 -->~50 ms

运行它release在 Visual Studio 中附带调试器--->~25 ms

运行它release在 Visual Studio 中没有附加调试器--->~20 ms

运行它outsideVisual Studio 的 (release构建)--->~80 ms

正如您所看到的,在 Visual Studio 之外的版本中运行它实际上比运行带有附加调试器的调试构建需要更长的时间!

有问题的 DLL 是由同一个编译器在同一解决方案中构建的,并且我已经仔细检查了启动应用程序的目录中的所有 DLL 都是正确的。

这种行为的原因可能是什么?

EDIT 5: 主应用程序生成另一个控制台应用程序并使用命名管道与其进行通信。事实证明,不生成另一个应用程序可以使 DLL 在 Visual Studio 之外快速调用。

然而,相同的应用程序在 Visual Studio 内部和外部生成,因此我不明白为什么它会减慢 Visual Studio 外部的其他调用。

EDIT 4: 事实证明,只有当我将函数调用放在主程序代码的某些部分时,才会出现这种缓慢的行为,所以这一定是与此相关的问题。虽然有很多行,但我会继续研究。

无论如何,感谢您的建议,它们对于确定问题很有用。

EDIT 3: 使用 QueryPerformanceCounter 进行测量:

Visual Studio 内部测得的 CPU 周期 (~50k) 是外部测得的 CPU 周期 (~110k) 的一半(顺便问一下,这些是 QueryPerformanceCounter() 返回的实际 CPU 周期吗?)。

将其除以频率显示与 std::chrono 相似的结果。

EDIT 2: 我按照建议检查了进程资源管理器,VS 内和 VS 外加载的 DLL 是相同的。

EDIT 1: 按照要求,我尝试了这个:

auto beginTime = std::chrono::high_resolution_clock::now();

for (int i = 0; i < 1000; ++i)
{
    DllFunction();
}
auto endTime = std::chrono::high_resolution_clock::now();

long long totalTime = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();

结果: 运行它release在 Visual Studio 中附带调试器--->~19 seconds

运行它outsideVisual Studio 的 (release构建)--->~40 seconds


在您第一次调用 DLL 之前,该 DLL 不会加载到程序中。如果该函数非常小,则程序可能会花费大部分时间来加载 DLL。
尝试改成这样:

DllFunction();
auto beginTime = std::chrono::high_resolution_clock::now();

for (int i = 0; i < 1000; ++i)
{
    DllFunction();
}
auto endTime = std::chrono::high_resolution_clock::now();

long long totalTime = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();

这样,就不会考虑加载时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Visual Studio 外部启动时程序运行速度较慢 的相关文章

随机推荐

  • Objective C sqlite3问题

    我发现在 iPhone 应用程序中更新 插入表格时遇到问题 因为我有一个文本列 当该文本包含 符号时 事情就会变得混乱 处理这个问题的最佳方法是什么 在使用带有撇号的字符串之前我应该 检查吗 有没有一种快速添加格式的方法 可以在每个撇号前面
  • actionPerformed 中的线程睡眠

    我正在尝试制作一个有 3 个按钮的小程序 所有按钮都是白色的 按下第一个按钮 带有文字 开始 将使第二个按钮变为橙色 3 秒钟 然后 在此时间之后 它将再次变为白色 而第三个按钮将永久变为绿色 然而 在我的下面的代码中 我在实现这一点时遇到
  • 将函数指针作为参数传递给 dll 函数并从 dll 内部调用它们是否安全?

    我想将一些 无论是否为 dll 函数指针作为参数传递给一些 dll 函数 并从 dll 内部调用它们 我想知道它是否安全 因为我找到了有关的信息http publib boulder ibm com infocenter zos v1r10
  • 如何在 iOS Swift 4 中检测屏幕锁定/解锁?

    如何在 iOS 中检测屏幕锁定 解锁 我正在使用 Swift 4 Xcode 9 2 并且我尝试过以下链接 但它们对我不起作用 iOS swift 3 检测到屏幕解锁失败 https stackoverflow com questions
  • C99 指定初始化程序重复索引在构建输出或 lint 中根本未标记

    前几天我玩了一下指定的初始化器 令我惊讶的是 多次使用相同的索引是有效的 更重要的是 当我这样做时 它甚至没有产生编译器警告 错误 甚至信息语句 甚至 PC Lint 似乎也不关心 我认为这最让我惊讶 我想知道在这种情况下编译器是否有原因甚
  • 对强连通图的最小添加

    我有一组节点和它们之间的一组有向边 边缘没有重量 如何找到必须添加的最小数量的边以使图强连接 即应该有一条从每个节点到所有其他节点的路径 这个问题有名字吗 这是一个非常经典的图问题 运行类似 Tarjan SCC 算法的算法来查找所有 SC
  • 两条线之间的角度错误

    我想得到两条线之间的角度 所以我使用了这段代码 int posX ScreenWidth gt gt 1 int posY ScreenHeight gt gt 1 double radians degrees radians atan2f
  • 用python计算梯度

    我想知道如何numpy gradient工作 我用梯度来尝试计算群速度 波包的群速度是频率相对于波数的导数 而不是一组速度 我向它提供了一个 3 列数组 前 2 列是 x 和 y 坐标 第三列是该点 x y 的频率 我需要计算梯度 我确实期
  • Git 致命:远程端挂起

    所以我以为我终于在 Windows 上完成了所有设置 然后遇到了这个问题 当前设置 网址 ssh user host port myapp git 已经运行 Putty 并且可以通过 ssh authorized keys 直接使用有效的
  • Firebase 如何处理长整型和双精度型?

    Firebase Java API 指定 Long 是传递给 setValue 的有效类型 JavaScript 只支持单一数字类型 相当于 Java 的 double 因此 如果我从 JavaScript 插入一个数字并稍后从 Java
  • 我可以在应用程序运行时以编程方式翻转 Info.plist 值吗?

    我有兴趣使用SBUsesNetwork and UIRequiresPersistentWiFi我的应用程序中的密钥 但是 我想仅在使用一组特定的视图控制器时启用它们 有没有办法在应用程序运行时以编程方式翻转这些键值 您无法在运行时修改捆绑
  • Boost Python 没有 to_python for std::unique_ptr

    我有一个无法解决的 boost python 问题 我试图公开一个包含返回函数的类std unique ptr 签名看起来像 std unique ptr
  • 在 pygame 物理模拟中添加 wxPython GUI 元素

    我做了一个pygame物理模拟 抛射运动 但它缺乏交互性 比如接受发射角度 速度等 我想添加带有增加 减少箭头的输入框 但不知道如何去做 谢谢您的帮助 也许你可以尝试PGU http www pygame org project 108 菲
  • Java 无法通过 JDBC-ODBC 从 Access 检索 Unicode(立陶宛语)字母

    我有数据库 其中一些名称是用立陶宛字母写的 但是当我尝试使用 java 获取它们时 它会忽略立陶宛字母 DbConnection zadanie connect createStatement ResultSet TYPE SCROLL I
  • 如何定义和使用 Common Lisp 包(库)?

    我在几个 Lisp 源文件中开发了一些 Common Lisp 函数 我希望这些函数可以轻松地供我编写的其他函数使用 或者如果我认为它们对其他人有用的话 可以在 github 上提供 现在 我只是将它们放在一些预定义的文件夹中并使用 req
  • Excel:将两列合并为具有交替值的一列

    如何将两列数据合并为一列 如下所示 Col1 Col2 Col3 A 1 A B 2 1 C 3 B 2 C 3 您可以在列中使用以下公式D按照我的例子 请记住增加 A 1 B 6根据您的数据范围 INDEX A 1 B 6 INT ROW
  • const 值会按实例存储吗?

    对于这样的类型 public class BlurEffect public const string Name Blur public int Amount get set 我有几个成员 比如 Name 所有成员都相同 我应该将其设为静态
  • UIButton 状态的键值观察

    UIButton 有一个状态属性 所有帐户似乎都符合 KVO 并且没有文档表明其他情况 但是 当我将观察者添加到 UIButton 的状态属性时 观察者回调从未被调用 怎么会 如果你查看 UIControl 的文档 state 属性被标记为
  • CSS 无法在生产中加载 - 开发中一切正常(Rails 4.1、Capistrano 3;bootstrap),更新:nginx 配置问题

    问题如下 在开发中一切正常 但是当我将 Rails 应用程序部署到生产环境时 该网站以纯 html 格式运行 但 CSS 引导程序 未加载 JS 可能也未加载 抱歉 我花了 2 天时间寻找了大约 15 种可能的解决方案 但无法使其发挥作用
  • 在 Visual Studio 外部启动时程序运行速度较慢

    我注意到我的程序有一些奇怪的行为 我使用 Visual Studio Professional 2013 Update 1 用 C 编写它 它由一个 exe 应用程序组成 该应用程序链接多个 DLL 并调用这些 DLL 中定义的函数 在我的