我的程序分配它在启动时略低于1MB的所有资源,除了原始局部变量之外不多。分配最初由malloc
进行,所以在堆上,但我想知道将它们放在堆栈上是否会有任何区别。
在程序运行时间为3秒到3分钟的各种测试中。稳定地访问堆栈似乎更快达到10%。我改变的只是malloc结构或将它们声明为自动变量。
我发现的另一个有趣的事实是,当我将对象声明为static
时。程序运行速度会慢20~30%。我不知道为什么。我仔细检查了我是否犯了错误但唯一的区别是static
是否存在。 static
变量是否会在自动变量中出现在堆栈中的其他位置?
在我有相反的经验之前,在C ++类中,当我将const成员数组从非静态变为静态时,程序确实运行得更快。内存消耗是相同的,因为该对象只有一个实例。
程序运行时是否受到对象驻留在内存中的位置的影响?即使如此,编译器是否可以设法将对象放置在正确的位置以获得最大效率?
答案 0 :(得分:1)
嗯,是的,程序性能会受到对象驻留在内存中的影响。
问题是,除非您对编译器的工作原理及其如何使用特定主机系统(操作系统服务,硬件,处理器缓存等)的功能以及如何配置这些功能有深入的了解,否则您将不会能够始终如一地利用它。即使您成功,小的更改(例如升级编译器,更改优化设置,更改进程配额,更改物理内存量,更改硬盘驱动器[例如用于交换空间])都会影响性能,并且并不总是很容易预测变化是否会改善或降低绩效)。性能对所有这些事情以及它们之间的相互作用都很敏感,如果没有仔细分析,这种方式并不总是很明显。
答案 1 :(得分:1)
程序运行时是否受到对象驻留在内存中的位置的影响?
是的,程序性能会受到内存中对象位置以及其他因素的影响。
每当访问堆中的对象时,都可以通过取消引用指针来完成。取消引用指针需要额外的计算来查找下一个存储器地址,并且在您和您的数据之间的每个附加指针(例如指针 - >指针 - >实际数据)将使其稍差。除此之外,它还会增加CPU的高速缓存未命中率,因为它希望接下来访问的数据实际上不在连续的内存块中。换句话说,CPU试图优化其管道的假设结果是错误的,并且它为不正确的预测付出了代价。
即使如此,编译器也无法设置将对象放置在 适合最高效率的地方?
C / C ++编译器会将对象放在你告诉它的任何位置。如果你正在使用malloc
,你不应该期望编译器把东西放在堆栈上,反之亦然。
即使原则上编译器也无法执行此操作,因为malloc
动态在运行时分配内存,在编译器的作业结束很久之后。在编译时知道 的是堆栈的大小,但是这个内存的内容是如何组织的完全取决于你。
您可以从编译器优化设置中获得一些好处,但是在优化工作中的大部分好处将更好地用于改进所使用的数据结构和/或算法。