在下面的示例中,test1
类没有ctor/dotr
,test2
为空ctor
和dtor
。
在分配大量test1
和test2
时,空ctor
和dtor
会降低效果吗?
#include <cstdlib>
using namespace std;
class test1
{
public:
int m_member;
// Without ctor/dtor
};
class test2
{
public:
int m_member;
// Empty ctro
test2(void)
{
// Nothing.
}
// Empty dtor
~test2(void)
{
// Nothing.
}
};
int main(int argc, char* argv[])
{
// Which one of these lines is faster?
test1* t1 = new test1[500 * 1024 * 1024];
test2* t2 = new test2[500 * 1024 * 1024];
return EXIT_SUCCESS;
}
修改: 我相信测试这段代码并不容易,因为分配大量内存会影响程序的下一行和系统速度。
答案 0 :(得分:4)
这是不太可能的 - 特别是因为你的构造函数和析构函数是内联的,所以编译器可以优化它们。话虽如此 - 为什么不测量它而不是询问Stack Overflow?
答案 1 :(得分:3)
我在代码中包含C ++ 11 chrono函数后对其进行了基准测试。 相对速度依赖于编译器优化开关。 当使用没有优化的Gnu编译器编译时(g ++ -std = c ++ 11 -O0),在我的笔记本电脑上使用i7 cpu(us = microseconds)完成test2的分配大约需要27倍(~100 us vs 2700 us)。与此相反,更高级别的优化(g ++ -std = c ++ 11 -O2)使得test1的分配比test2分配花费大约9倍(~90 us vs 10 us)。每次运行都会有所不同。这是相关的修改代码:
steady_clock::time_point start1, end1, start2, end2;
start1 = steady_clock::now();
test1* t1 = new test1[500 * 1024];
end1 = steady_clock::now();
start2 = steady_clock::now();
test2* t2 = new test2[500 * 1024];
end2 = steady_clock::now();
cout<<duration_cast<microseconds>(end1 - start1).count()<<endl;
cout<<duration_cast<microseconds>(end2 - start2).count()<<endl;
分配时间的这种巨大差异有些出乎意料,因为默认的ctor和dtor可能是空的。
编辑:正如Dale在下面的评论中所建议的那样,我根据切换顺序做了额外的基准测试。 -O0
标志将执行时间更改为(~15 us vs 2800 us)。使用-O2
标志执行时间为(~10 us vs~80 us)。多次运行的标准偏差时间相对较大,但速度顺序保持不变。