问题:
我的问题是,如果我将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机器上可执行文件的加载速度是否缓慢或更准确延迟的原因是什么?如果我把所有大型结构从堆栈移到堆上,你认为它会解决吗?
答案 0 :(得分:5)
现代计算中没有很多事情需要分钟。不在具有嵌入式Windows版本的计算机上。不是处理器,不是RAM,不是磁盘。
除 one 外,网络仍然基于20世纪80年代最后有效的假设。 TCP / IP已成为唯一常用的协议。但是有一个缺陷,没有合理的方法可以发现可能的连接尝试时间。因此,连接超时基于绝对最坏情况,试图连接到世界各地的机器,与需要旋转鼓以加载程序的调制解调器连接。
Windows上的最小超时是45秒的硬烘焙。而且,一般而言,嵌入式机器中不太可能出现这种情况。您可能已将其连接到网络以进行初始化,但它已不再连接,或者您复制的计算机可能不再启动。
通过首先查找已断开连接的磁盘驱动器,这很常见。接下来使用SysInternals&#39;像TcpView这样的实用程序可以查找网络活动,例如尝试连接到CRL服务器。使用Process Explorer查找程序卡住的位置。 Mark Russinovich&#39;博客非常适合使用这些工具展示他的故障排除策略。祝你好运。