C++中循环的性能差异
Performance difference for loops in C++
考虑以下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;
}
笔记:
- 我故意使用数组而不是向量。
- 类成员
_matrixElements
是使用new
创建的floats
数组。 - 这里的矩阵是使用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)
}
}
首先在C
和C++
有"AS IF"规则。这是一些关于这个问题的答案。 这意味着,如果启用编译器优化,则不应有显著差异。
事实上,对于如此简单的修改,如果最终的机器代码完全相同,我不会感到惊讶。因此,请保持代码的可读性。
我确实比较了两个版本,并且第一个版本重新计算了每次迭代的矩阵总大小。编译器假定调用std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::_M_insert<double>(double)
时rows
或cols
值可以更改。 请注意,此操作非常快,因此当您进行测量时,我怀疑您是否能够测量任何差异。
相关文章:
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- C++中循环的性能差异
- C++循环性能的倍数
- 在原始循环上使用boost::irange的性能损失
- OpenMP 嵌套循环处理性能
- 虚拟函数调用的性能作为 for 循环中的上限
- 在 C++ 中使用 OpenMP 并行化两个 for 循环不会提供更好的性能
- C++和Java的字符串循环性能比较
- C++:if 内部循环的性能影响
- 为什么在循环外举起弦会导致性能较慢
- openMp的多个独立for循环的性能问题
- C 的性能11现代风格的循环与老式循环
- 用于C++和性能关键型应用程序中的循环
- 奇怪的OpenCL调用C++上的副作用来提高循环性能
- 为什么asm中的这种差异对性能很重要(在未优化的ptr++与++ptr循环中)
- 具有相同索引的循环的性能
- 提高循环缓冲区或堆排序性能
- 如何在测量性能时减少循环的开销
- 性能:循环声明与循环重新初始化