zar*_*zar 2 c++ performance memory-management visual-studio-2010 windows-7
题:
我的问题是如果我替换下面的函数foo1(我在我的代码中有),对我的应用程序内存占用或性能会有什么影响foo2.在应用程序中经常调用此函数.
#define SIZE 5000
void foo1()
{
double data[SIZE];
// ....
}
void foo2()
{
std::unique_ptr< double[] > data( new double[SIZE] );
// ....
}
Run Code Online (Sandbox Code Playgroud)
语境:
在实现新功能/模块后,我的MFC应用程序在运行Windows 7的嵌入式设备上加载速度非常慢.相同的应用程序在PC上快速加载.至少有一个区别和我怀疑的原因是嵌入式单元上的RAM真的很低,只有768 MB.
我调试它以找出这种延迟发生的位置,并在加载过程中记录应用程序中的时间戳.我发现的很有趣.当我双击exe时,记录第一个时间戳需要大约一分钟,之后它会快速运行,因此所有延迟都在那里.
我的理论是Windows正在花费所有这些时间来为exe设置环境,一旦完成,它就会快速运行.我怀疑这是因为在应用程序中堆栈上声明了很多大型结构,我不得不将其中一些移动到堆中以消除堆栈溢出错误,即使在具有新功能的PC上也是如此.
您认为低RAM机器上可执行文件加载速度慢或更准确的原因是什么?如果我把所有大型结构从堆栈移到堆上,你认为它会解决吗?
在现代计算中,有很多事情需要花费一分钟.不在具有嵌入式Windows版本的计算机上.不是处理器,不是RAM,不是磁盘.
除了一个,网络仍然基于20世纪80年代最后有效的假设.TCP/IP已成为唯一常用的协议.但是有一个缺陷,没有合理的方法来发现连接尝试可能需要多长时间.因此,连接超时基于绝对最坏情况,尝试连接到世界各地的机器,与需要旋转鼓以加载程序的调制解调器连接.
Windows上的最小超时是45秒.而且,通常情况下,嵌入式机器中的条件肯定不大.您可能已将其连接到网络以进行初始化,但它已不再连接,或者您复制的计算机可能不再启动.
通过首先寻找断开连接的磁盘驱动器来追逐它,非常常见.接下来使用SysInternals的实用程序(如TcpView)来查找网络活动,例如尝试连接到CRL服务器.使用Process Explorer查找程序卡住的位置.Mark Russinovich的博客非常适合展示他使用这些工具的故障排除策略.祝它好运.