介于 [固定数组] 和 [带内存分配的指针] 之间的性能

performance between [fixed array] and [pointer with memory allocation]

本文关键字:分配 之间 性能 内存 指针 数组 介于      更新时间:2023-10-16

我正在制作可以计算很多次(10+小时(的科学代码,所以速度比任何其他事情都重要。

案例1

class foo{
public:
double arr[4] = {0};
...
foo& operator = (foo&& other){
std::memcpy(arr, other.arr, sizeof(arr));
}
...
}

案例2

class fee{
public:
double *arr = nullptr;
fee(){
arr = new double[4];
}
~fee(){
if(arr != nullptr)
free[] arr;
}
...
&fee operator = (fee&& other){
arr = other.arr;
other.arr = nullptr;
}
...
}

这些类用于向量(长度 4(和矩阵(大小 4x4(计算。

我听说编译器可以优化固定大小的数组。 但在这种情况下,无法优化 r 值计算(因为必须复制所有元素而不是指针切换(。

A = B*C + D;

所以我的问题是,内存分配和释放或复制亲密记忆哪个更昂贵?

或者也许还有另一种方法可以提高性能(例如创建表达式类(?

第一个性能并不是一个真正的语言问题(除了标准库中使用的算法(,而是一个实现问题。无论如何,大多数最常见的实现将程序堆栈用于自动变量,将系统堆用于动态变量(通过new分配(。

在这种情况下,性能将取决于使用情况。堆管理是有代价的。因此,如果您经常分配和解除分配它们,堆栈管理应该是赢家。但另一方面,移动分配的数据只是指针交换的问题,当您可能需要为未分配的数据memcpy时。

总内存也有很强的影响。堆内存仅受可用系统内存(运行时(的限制,而堆栈大小通常在构建时(链接阶段(定义,并在加载时静态分配。因此,如果总大小仅在运行时已知,请使用动态内存。

您在这里尝试进行低级优化。然后规则是进行分析。构建一个小程序,使这些结构达到预期用途,并在这两种实现中使用分析工具(*(。我会尝试使用具有良好内置优化的标准向量。


(*( 请注意,简单地测量一次运行的时间是不准确的,因为它取决于许多其他参数,例如其他程序(包括系统程序(引起的负载。