有点迂腐的问题:哪个更有效率

Slightly pedantic question: which is more efficient?

本文关键字:有效率 问题      更新时间:2023-10-16

哪个更有效率?还是它们都同样有效?星号线中的底层架构是怎么回事?

(1(

for(int i = m_size; i > index; --i)
{
     int k = normalize(i);             ***
     m_data[k] = m_data[k - 1];
}

(2(

int k = 0; ***
for(int i = m_size; i > index; --i)
{
     k = normalize(i);             ***
     m_data[k] = m_data[k - 1];
}

代码段 #1 对于朴素的编译器更有效,因为第二个代码段需要在变量 k 中加载 0。

一个好的编译器会认识到在 for 循环中加载 k 之前没有使用 k,并将优化额外的赋值。

您可以使用代码段 2,而无需加载 0: int k;

不要为这种微观级别的优化而烦恼。让编译器/优化器为您完成。根据C++风格,第二种方法更好,因为它声明的变量接近用法(如"代码完成"一书中所述(。除了 C 样式之外,如果您想在循环后使用变量,第一种方法很好。

请注意,函数normalizem_data类型、所涉及的运算符[]等都在优化中发挥作用。数据大小、并行度、处理器架构在程序的运行时性能中也起着重要作用。

在不知道你在说什么架构的情况下,很难说"底层架构中发生了什么"。但总的来说,任何"哪个更有效"的问题都只能以显而易见的方式真正得到回答:通过衡量哪个版本最终在您的特定应用程序中更有效率......

请注意,任何远程有用的编译器都应该将两个示例转换为完全相同的机器代码......

这不是效率问题。第一种方法更好,因为它使用 RAII(资源分配即初始化(方法。第二个更像是C风格。您应该在使用它时声明变量,而不是在功能块的开头。请参阅此示例:

void f1(bool use)
{
    ComplexObject c; // creating an object that has very costly, time-and-memory-consuming initialization
    if (! use)
        return;
    c.someFunction();
}

明白我的意思吗?