C++中循环的性能差异

Performance difference for loops in C++

本文关键字:性能 循环 C++      更新时间:2023-10-16

考虑以下C++类和结构

typedef struct MatrixDims
{
int rows, cols;
} MatrixDims;
class Matrix 
{
private:
float *_matrixElements;
MatrixDims _matrixDims;
public:
Matrix(int rows, int cols);
~Matrix();
void printMatrix() const;
}

笔记:

  1. 我故意使用数组而不是向量
  2. 类成员_matrixElements是使用new创建的floats数组。
  3. 这里的矩阵是使用1 维数组实现的。

我的问题:

方法printMatrix()的以下两个实现之间是否存在任何性能差异

void Matrix::printMatrix() const
{
for (size_t i = 0; i < this->_matrixDims.rows * this->_matrixDims.cols; i++) // (1)
{
cout << this->_matrixElements[i]; // (2)
}
}
void Matrix::printMatrix() const
{
size_t size = this->_matrixDims.rows * this->_matrixDims.cols; // (3)
float *mat = this->_matrixElements; // (4)
for (size_t i = 0; i < size; ++i) // (5)
{
cout << mat[i]; // (6)
}
}

首先在CC++有"AS IF"规则。这是一些关于这个问题的答案。 这意味着,如果启用编译器优化,则不应有显著差异。

事实上,对于如此简单的修改,如果最终的机器代码完全相同,我不会感到惊讶。因此,请保持代码的可读性。

我确实比较了两个版本,并且第一个版本重新计算了每次迭代的矩阵总大小。编译器假定调用std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::_M_insert<double>(double)rowscols值可以更改。 请注意,此操作非常快,因此当您进行测量时,我怀疑您是否能够测量任何差异。