小结构的使用注意
- 小结构,主要是指struct或class,其声明的属性的总大小很少,一般就只有几个基本类型的大小
- 这些小结构作为函数的参数或返回值声明的,建议直接让他们拷贝进去, 不要用指针或引用类型了
- 这个问题与CPU寄存器有关,引用与指针类型只有引用地址进入寄存器,具体数据还在内存,导致每次调用时,CPU还得去内存取一次值
- 以下进行测试,每种方式调用测试10万次,clock计时,结果是
test_fun1 “const TestDat&” cost: 1785
test_fun2 “const TestDat” cost: 1281
test_fun3 “const TestDat*” cost: 1735
明显使用直接拷贝(test_fun2)速度是最快的
以下是测试的代码
struct TestDat {
int a;
TestDat() :a(1) {}
};
void test_fun1(const TestDat& a) {
int t = 0;
for (int i = 0; i < 10000; ++i) {
t += a.a;
}
}
void test_fun2(const TestDat a) {
int t = 0;
for (int i = 0; i < 10000; ++i) {
t += a.a;
}
}
void test_fun3(const TestDat* a) {
int t = 0;
for (int i = 0; i < 10000; ++i) {
t += a->a;
}
}
void test_dec() {
const int test_count = 100000;
const int d_count = 10000;
TestDat d[d_count];
int btime = 0, etime = 0;
btime = clock();
for (int i = 0; i < test_count; ++i) {
test_fun1(d[1000]);
}
etime = clock();
std::cout << "test_fun1 cost: " << etime - btime << std::endl;
btime = clock();
for (int i = 0; i < test_count; ++i) {
test_fun2(d[1000]);
}
etime = clock();
std::cout << "test_fun2 cost: " << etime - btime << std::endl;
btime = clock();
for (int i = 0; i < test_count; ++i) {
test_fun3(&d[1000]);
}
etime = clock();
std::cout << "test_fun3 cost: " << etime - btime << std::endl;
}
int main()
{
test_dec();
}