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

Is there a point in memory on the stack where performance drops significantly?

本文关键字:存在 内存 是否 堆栈 性能      更新时间:2023-10-16

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

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

    image.getTrans().x += velocity[VELOCITY_X];
    image.getTrans().y += velocity[VELOCITY_Y];

在从0个对象到1500个对象(我发现这本身就很大)之后,fps以恒定的速率从大约2000 fps下降到200 fps,但与添加大约50或100个以上的对象之后相比,fps降低到60 fps50 fps,并且低于2 fps1 fps,并且在添加几个以上之后更糟。

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

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

很抱歉这里有任何未使用的术语或未正确解释,我对许多与内存相关的想法相对陌生

首先,很少有编译器或程序在L1、L2或L3缓存中分配内存。原因很简单,就是他们不知道这些地址。此外,L1、L2和L3高速缓存的大小比主存储器小得多。

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

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

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

与堆栈分配相比,数组大小的增加可能会使程序遭受更大的损失。数组越大,对它执行的迭代越多。每次迭代都会打断处理器的数据处理周期,这很浪费时间。

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

阅读以下主题:

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

与往常一样,评测您的代码以查找瓶颈。有时,设计中的更改可能比简单的代码更改具有更高的ROI。