Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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 - Fatal编程技术网

C++ 分配更多内存会降低操作速度吗?

C++ 分配更多内存会降低操作速度吗?,c++,performance,C++,Performance,我正在读一本名为《实时渲染》的书,作为光线-球体相交算法的优化,使用球体的平方半径,因此作者说: 标量r2(半径的平方)可以计算一次并存储在数据中 球体的结构,以进一步提高效率。在里面 练习这样的“优化”可能会慢一些,因为这样会占用更多的内存 访问,是影响算法性能的主要因素 这怎么可能没有效率呢?r2值将在函数的本地范围内访问一次,这会比显式计算r2=r*r慢吗 我甚至不确定缓慢的操作是否是值访问,或者是否实际将数据存储在内存中。您确实应该对其进行基准测试,但作者可能想的是。有时(经常但不总是)

我正在读一本名为《实时渲染》的书,作为光线-球体相交算法的优化,使用球体的平方半径,因此作者说:

标量r2(半径的平方)可以计算一次并存储在数据中 球体的结构,以进一步提高效率。在里面 练习这样的“优化”可能会慢一些,因为这样会占用更多的内存 访问,是影响算法性能的主要因素

这怎么可能没有效率呢?
r2
值将在函数的本地范围内访问一次,这会比显式计算r2=r*r慢吗


我甚至不确定缓慢的操作是否是值访问,或者是否实际将数据存储在内存中。

您确实应该对其进行基准测试,但作者可能想的是。有时(经常但不总是)重复的缓存未命中(或错误)会减慢程序的速度

通常,当(,)处理器缺少缓存(因此三级缓存未命中)到从RAM棒中获取数据的程度时,它可能会丢失几百个周期(或纳秒),这足以进行几百次算术运算(对寄存器内或一级缓存内的数据)。 因此,一个简单的计算可能不值得(例如,因为具有更大的结构可能需要更多的内存带宽和更多的缓存未命中)

但是缺点在于细节,你需要基准测试(在不同的计算机上,事情可能会有所不同,例如在你的笔记本电脑和我的桌面上,运行相同的Linux操作系统,使用相同的编译器和相同的二进制可执行文件),当然,在你的编译器中启用(例如,
g++-Wall-O2-march=native
with…)

你会通过阅读网上的书学到更多


阅读上这篇发人深省的文章。它还提供了一个典型PC上各种操作的大致时间表(它从别处借来了)。

我记得以前就在这一点上。这是不久前的事,我仍在学习这一点。我将尝试提供一个非正式的答案来补充已经精确的答案

这两个链接对我特别有帮助:

不过,最快的入门方法是为自己准备一个合适的分析器,它可以分解评测会话中涉及的代码库的每一个小部分的执行时间。接下来,当您找到没有明显算法瓶颈的更困难的热点时,开始深入测量缓存未命中率和br主播预测失误

之后,尽管有一个相当优化的算法,但了解这些热点存在的原因以及如何处理它们开始变得相当自动化——您将发现自己追逐热点的信息

内存层次结构

然而,简单地说,计算机体系结构有一个内存层次结构,从小型、快速、昂贵的内存到大型、慢速、廉价的内存。它从一个速度非常慢的大型硬盘到分页到DRAM(例如,4千字节块),再到由64字节缓存线组成的CPU缓存层次结构,一直到内存一个小小的寄存器,可能只有微不足道的8字节(64位),而这个小小的寄存器是执行大多数操作的地方

一旦执行了操作并计算了结果,通常情况下,结果必须以其方式备份此内存层次结构,以便可以持久保存它们,同时为在新内存区域上执行新操作腾出空间

为了快速实现这一点,硬件通常被设计成以相当大的块从那些较大但较慢的内存中获取内存。例如,像硬盘这样的辅助存储设备比DRAM慢得多,因此内存中的计算机页面以4KB的块为单位。假设是,即使您立即请求一个8字节(64位数据块),您可能会访问内存周围区域的数据。因此,内存被分页到DRAM中,以对齐的4 KB数据块为单位,例如,假设(或“希望”)程序员将在以下指令集中访问大量该数据块

从DRAM到CPU缓存的过程也是相同的。CPU缓存比DRAM快得多,因此计算机倾向于将内存从DRAM以相当大的块(通常是64字节对齐的缓存线)提取到CPU缓存中.硬件设计师的假设/预测/希望再次是,你会在它被逐出之前利用它

这种过程从CPU缓存到寄存器(甚至比CPU缓存还要快)再次重复,以对齐的方式从较慢的内存移动到较快的内存(尽管这次是以非常小的方式)

速度

一个软件的速度很大程度上最终会受到内存访问的限制。需要一个非常优化的内存布局或一小块内存上非常繁重的计算,才能真正受到算术的限制,而不是通过将数据块从较慢的内存形式传输到较快的内存形式的过程。你可能会在rea中看到这一点l-world基准测试中,使用AVX指令将实际操作(主要由浮点运算组成)的速度提高了45%。为什么当AVX指令的速度应该是标量版本的8倍时,我们只获得了45%的速度?抛开可能插入AVX指令的潜在编译器优化不谈,这可能会导致很多这与内存有关。计算机运算速度非常快,但它们只能在将内存加载到速度更快但数量很少的内存(例如寄存器)中时才能完成运算

从软件工程的角度来看,它很有帮助
template<typename T> struct sphere
{
  T posx,posy;
  T r;
  T r2;

template<typename T> static sphere<T> create( T posx, T posy, T r );
}