Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 堆栈内存中是否存在性能显著下降的点?_C++_Performance_Memory_Stack - Fatal编程技术网

C++ 堆栈内存中是否存在性能显著下降的点?

C++ 堆栈内存中是否存在性能显著下降的点?,c++,performance,memory,stack,C++,Performance,Memory,Stack,堆栈上的内存分配量是否存在性能显著下降的点?我知道如果它在堆上,当内存从一级移动到二级再移动到主内存时,缓存未命中的数量会急剧增加,但是堆栈呢 在我个人的例子(游戏引擎)中,注释掉所有其他函数后,重点是在每个对象的每一帧调用这行代码: image.getTrans().x+=velocity[velocity_x]; image.getTrans().y+=速度[velocity_y]; 在从0个对象到1500个对象(我发现其本身对于很少的对象来说是大的)之后,fps以恒定的速率从大约2000

堆栈上的内存分配量是否存在性能显著下降的点?我知道如果它在堆上,当内存从一级移动到二级再移动到主内存时,缓存未命中的数量会急剧增加,但是堆栈呢

在我个人的例子(游戏引擎)中,注释掉所有其他函数后,重点是在每个对象的每一帧调用这行代码:

image.getTrans().x+=velocity[velocity_x];
image.getTrans().y+=速度[velocity_y];
在从0个对象到1500个对象(我发现其本身对于很少的对象来说是大的)之后,fps以恒定的速率从大约
2000 fps
下降到
200 fps
,但是在添加大约50或100个对象之后,fps下降到
60 fps
50 fps
,然后下降到
2fps
1fps
,再加上一些之后更糟

这里要做的就是将
velocity[type]
(在堆栈上)添加到图像的
转换中。type
(也在堆栈上)

由于现代计算机每秒可以运行如此荒谬的计算量(我相信大约360亿次),所以我能想到的唯一解决方案是,大部分时间,程序都在等待内存,我无法理解,因为这些都在堆栈上


很抱歉,这里没有用到任何术语或解释,我对很多关于内存的想法都比较陌生。首先,很少有编译器或程序在L1、L2或L3缓存中分配内存。原因很简单,他们不知道地址。此外,L1、L2和L3缓存的大小比主内存小得多

通常,堆栈的容量与性能关系不大。堆栈的容量通常限制函数调用嵌套或递归,或者限制可以存储的局部变量的数量

如果堆栈内存朝堆方向增长,则在堆栈空间不足(与堆发生冲突)或堆增长并覆盖堆栈时可能会出现问题

堆栈内存的分配通常是增加堆栈指针的值。最坏的情况是,这涉及到将一个值从内存加载到寄存器,调整寄存器中的值,然后将3个操作存储回内存

与堆栈分配相比,您的程序可能更容易受到数组大小增加的影响。阵列越大,对其执行的迭代次数越多。每次迭代都会中断处理器的数据处理周期,这会浪费时间

如果您的数据组织正确且大小正确,处理器可能会将所有数据拖入其缓存。如果我们假设当处理器从内存中提取数据并将其放入缓存时,它不会加载一个变量。最有可能的情况是,处理器拖入足够的数据来填充一条或多条缓存线。如果您的阵列适合缓存线,则处理器会将您的所有数据加载到缓存中。如果要访问彼此不相邻的阵列插槽,处理器可能必须重新蚀刻不同的内存,从而擦除现有数据(从而降低性能)

阅读以下主题:

  • 优化缓存性能
  • 数据驱动设计
  • 优化数据缓存性能

与往常一样,分析代码以查找瓶颈。有时,设计变更比简单的代码变更具有更高的ROI

太宽泛了,无法诊断到底是什么问题。堆栈也驻留在RAM中。您的假设不正确。堆栈/堆与一级/二级缓存几乎没有关系——局部性和预取是的,堆栈/堆不是。考虑到误解的程度,您自己的代码分析的可靠性很低。对不起,当我只能看到雾的时候很难帮上忙。算算吧。在零个要处理的对象时,有2000 fps。1500个对象时,速率降低到200fps。这可能是因为您有更多的数据要处理吗?将“SRAM”更改为“主存”。L1、L2和L3实际上是SRAM,而主内存不是(它是DRAM)。在我的嵌入式系统上,SRAM是主内存。我不知道我们的ARM7 SOC用于缓存的技术。我们没有DRAM。这很少见,但仍然是:术语“主内存”包括系统中的主SRAM(但不包括其缓存SRAM),以及Cortex-A、x86、x64、POWER、SPARC等使用的常用DRAM主内存。