问题:
我的问题是,如果我用替换下面的函数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,不是磁盘。
除一个之外,联网仍基于1980年代最后一次有效的假设。TCP / IP已成为唯一的常用协议。但是有一个缺陷,没有合理的方法来发现连接尝试可能要花费多长时间。因此,连接超时是基于绝对最坏情况下的条件,试图连接到世界中途的机器,并与需要旋转感光鼓以加载程序的调制解调器连接。
Windows上的最小超时设置为45秒。而且,总的来说,在嵌入式计算机中这种情况肯定不太可能发生。您可能已将其连接到网络上以对其进行初始化,但该网络已不再连接,或者从其复制的计算机可能不再通电。
首先寻找断开连接的磁盘驱动器(很常见),将其追逐下来。接下来,使用SysInternals的实用程序(例如TcpView)来查找网络活动,例如尝试连接到CRL服务器。使用Process Explorer找出程序卡在哪里。马克·鲁西诺维奇(Mark Russinovich)的博客非常棒,可以展示他使用这些工具的故障排除策略。祝你好运。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句