问题:
我的问题是,如果我用
foo1
替换下面的 foo2
(我的代码中有)这样的函数,会对我的应用程序内存占用或性能产生什么影响。该函数在应用中被频繁调用。
#define SIZE 5000
void foo1()
{
double data[SIZE];
// ....
}
void foo2()
{
std::unique_ptr< double[] > data( new double[SIZE] );
// ....
}
上下文:
在实现新功能/模块后,我的 MFC 应用程序在运行 Windows 7 的嵌入式设备上加载速度非常慢。相同的应用程序在 PC 上加载速度很快。至少有一个区别,我怀疑是嵌入式单元上的 RAM 非常低,只有 768 MB。
我对其进行了调试,以找出这种延迟发生在哪里,并在加载过程中记录了应用程序内的时间戳。我的发现很有趣。当我双击exe时,大约需要一分钟来记录第一个时间戳,之后它运行得很快,所以所有的延迟都在那里。
我的理论是Windows花费了所有这些时间来为exe设置环境,一旦完成,它运行得很快。我怀疑这是因为应用程序中的堆栈上声明了很多大结构,以至于我不得不将其中一些结构移动到堆中以消除堆栈溢出错误,即使在具有新功能的 PC 上也是如此。
您认为低 RAM 计算机上可执行文件加载缓慢或更准确地延迟加载的原因是什么?如果我将所有大型结构从堆栈移动到堆,您认为它会修复吗?
在现代计算中,没有多少事情需要花费分钟。 也不适用于具有嵌入式 Windows 版本的计算机。 不是处理器,不是 RAM,不是磁盘。
除了 one 之外,网络仍然基于 20 世纪 80 年代最后有效的假设。 TCP/IP 已成为唯一通用的协议。 但有一个缺陷,没有合理的方法来发现连接尝试可能需要多长时间。 因此,连接超时是基于绝对最坏的情况,尝试连接到地球另一端的机器,并与需要旋转鼓来加载程序的调制解调器连接。
Windows 上的最小超时设置为 45 秒。 而且,一般来说,这种情况在嵌入式机器中肯定不可能发生。 您可能已将其连接到网络以对其进行初始化,但它不再连接,或者您从中复制的计算机可能不再通电。
通过first寻找断开连接的磁盘驱动器来追踪它,这很常见。 接下来使用 SysInternals 的实用程序(例如 TcpView)来查找网络活动,例如尝试连接到 CRL 服务器。 使用 Process Explorer 找出程序卡住的位置。 Mark Russinovich 的博客很好地展示了他使用这些工具的故障排除策略。 祝你好运。
优化代码:检查代码是否存在效率低下、不必要的循环或大型数据库查询的情况。
减少资源使用:最大限度地减少应用程序加载的图像、脚本和其他资源的大小。
检查服务器性能:确保您的服务器有足够的资源(CPU、RAM)。如果 RAM 使用率很高,请考虑
使用 Mem Reduct 更好地管理内存并释放空间以实现更流畅的操作。
使用缓存:实施缓存策略,将频繁数据存储在本地,减少服务器负载。更新依赖项:过时的库或框架可能会降低性能。让他们保持更新。
这些步骤以及 Mem Reduct 等内存管理工具应该有助于提高应用程序的加载速度。