gpt4 book ai didi

c++ - 虚函数调用始终比普通函数调用更快。为什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:26 25 4
gpt4 key购买 nike

我编写了以下程序来测试虚拟功能在我的机器上的开销:

#include <iostream>
#include <ctime>
#define NUM_ITER 10000000000
// 5 seconds = 1000000000

static volatile int global_a;

void spin()
{
int a = global_a;
int b = a*a;
int c = a+5;
int d = a^b^c;
global_a = b*d;
}

struct A {
virtual void a() = 0;
};

struct B : A {
virtual void a() { spin(); }
};

struct C : A {
virtual void a() { spin(); }
};

void run_A1(A* a)
{
a->a();
}

void run_A(A* a)
{
for (long long i = 0; i < NUM_ITER; i++) {
run_A1(a);
}
}

void run()
{
for (long long i = 0; i < NUM_ITER; i++) {
spin();
}
}

int main()
{
global_a = 2;

A* a1 = new B;
A* a2 = new C;

std::clock_t c_begin, c_end;

c_begin = std::clock();
run_A(a1);
c_end = std::clock();

std::cout << "Virtual | CPU time used: "
<< 1000.0 * (c_end-c_begin) / CLOCKS_PER_SEC
<< " ms\n";

c_begin = std::clock();
run_A(a2);
c_end = std::clock();

std::cout << "Virtual | CPU time used: "
<< 1000.0 * (c_end-c_begin) / CLOCKS_PER_SEC
<< " ms\n";

c_begin = std::clock();
run();
c_end = std::clock();

std::cout << "Normal | CPU time used: "
<< 1000.0 * (c_end-c_begin) / CLOCKS_PER_SEC
<< " ms\n";

delete a1;
delete a2;
}

结果与我的预期相反:虚函数始终更快。例如,这是我使用 NUM_ITER = 10000000000 获得的输出之一:

Virtual | CPU time used: 49600 ms
Virtual | CPU time used: 50270 ms
Normal | CPU time used: 52890 ms

通过对生成的汇编文件的分析,我可以确认编译器没有优化掉任何重要的东西。我使用了具有以下选项的 GCC-4.7:

g++ -O3 -std=c++11 -save-temps -masm=intel -g0 -fno-exceptions -fno-inline test.cc -o test

为什么虚函数调用更快?或者为什么非虚拟函数调用速度较慢?分支预测器变得这么好了吗?或者也许这只是我的机器。也许有人也可以测试并发布他的时间安排?

最佳答案

在每次调用 run() 之前尝试重置 global_a:

void run()
{
global_a = 2;

...
}

void run_A(A *a)
{
global_a = 2;

...
}

不确定这是否有任何影响,但并非所有数学运算都需要相同的时间!

关于c++ - 虚函数调用始终比普通函数调用更快。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10775197/

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