gpt4 book ai didi

c++ - 我看到将我的类成员函数指定为内联实际上增加了执行时间,即使函数体非常小

转载 作者:行者123 更新时间:2023-11-28 01:22:32 25 4
gpt4 key购买 nike

我写了一个简单的类,并为类定义之外的成员函数定义了函数体。函数体尺寸很小(大约一行)。当我测试性能时,当我将函数定义指定为内联时,性能似乎在下降。

这是我的类和成员函数定义。

#include<iostream>
#include<sys/time.h>

class number {
protected:
long _val;
public:
number(long n): _val(n) {}

operator long() const;

number operator ++(int);
number& operator ++();

bool operator < (long n);
};

number :: operator long() const { return _val; }
number number :: operator ++(int) { return number(_val++); }
number& number :: operator ++() { _val ++; return *this; }
bool number :: operator < (long n) { return _val < n; }

#define microsec(t) (t.tv_sec * 1000000 + t.tv_usec)

int main() {
struct timeval t1, t2;

gettimeofday(&t1, NULL);
for(number n = 0; n < 999999999L; ++n);
gettimeofday(&t2, NULL);

std::cout << (microsec(t2) - microsec(t1)) << std::endl;
}

当我运行上面的代码时,大约需要 3.3 秒才能完成。

当我在成员函数定义前添加 inline 时,大约需要 4.6 秒。

我可以理解,如果函数体的大小很大,内联可能会影响性能。但是,就我而言,它们非常小。因此,它应该产生更好的性能或至少相同的性能。但是,执行时间随着内联而增加。

有人可以帮助我理解这种行为吗?

[编辑 1]问题不完全是关于优化。但是,要了解更多关于 inline 的信息。我知道由编译器决定是否遵守 inline 关键字并选择优化它认为合适的代码。但是,我的问题是为什么它会对性能产生不利影响(没有明确优化)。我能够始终如一地重现此行为。

正如本帖中一些人所建议的,我使用了 https://gcc.godbolt.org查看编译器使用和不使用 inline 生成的 ASM 命令。我看到为 main 生成的 ASM,因为这两种情况是相同的。我看到的唯一区别是,使用 inline 关键字时,不会为未使用的方法生成 ASM 代码。但是,两者生成的有效代码是相同的,因此在运行时长上应该不会产生任何差异。

以防万一,我正在使用 gettimeofday(&_t2, NULL); 获取当前系统时间以找出时差。

我正在使用带有 -std=c++11 标准选项的 g++ 编译器。我没有使用优化标志,因为这不是我问题的重点。

[编辑 2] 修改了代码片段以包含重现问题的完整代码。

最佳答案

启用优化的编译器将最清楚何时内联函数。事实上,将函数声明为内联可能不会将其内联,而不这样做可能会。没有什么理由。
我不知道它是什么,但是像这样内联一个循环应该不会影响执行时间 1.3 秒,因为它只会增加函数调用的速度,而不是函数内部的代码。

可以找到有关内联的更多信息 here .

关于c++ - 我看到将我的类成员函数指定为内联实际上增加了执行时间,即使函数体非常小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55466485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com