【发布时间】:2012-08-23 18:57:13
【问题描述】:
我在这里听到很多人说 C++ 在所有方面都与 C 一样快或快,但更简洁更好。
虽然我不反对 C++ 非常优雅且速度非常快的事实,但我没有找到任何替代关键内存访问或受处理器限制的应用程序的方法。
问题:就性能而言,C++ 中是否存在与 C 样式数组等效的方案?
下面的例子是人为的,但我对现实生活中的问题的解决方案很感兴趣:我开发图像处理应用程序,那里的像素处理量很大。
double t;
// C++
std::vector<int> v;
v.resize(1000000,1);
int i, j, count = 0, size = v.size();
t = (double)getTickCount();
for(j=0;j<1000;j++)
{
count = 0;
for(i=0;i<size;i++)
count += v[i];
}
t = ((double)getTickCount() - t)/getTickFrequency();
std::cout << "(C++) For loop time [s]: " << t/1.0 << std::endl;
std::cout << count << std::endl;
// C-style
#define ARR_SIZE 1000000
int* arr = (int*)malloc( ARR_SIZE * sizeof(int) );
int ci, cj, ccount = 0, csize = ARR_SIZE;
for(ci=0;ci<csize;ci++)
arr[ci] = 1;
t = (double)getTickCount();
for(cj=0;cj<1000;cj++)
{
ccount = 0;
for(ci=0;ci<csize;ci++)
ccount += arr[ci];
}
free(arr);
t = ((double)getTickCount() - t)/getTickFrequency();
std::cout << "(C) For loop time [s]: " << t/1.0 << std::endl;
std::cout << ccount << std::endl;
结果如下:
(C++) For loop time [s]: 0.329069
(C) For loop time [s]: 0.229961
注意:getTickCount() 来自第三方库。如果您想测试,只需替换为您最喜欢的时钟测量值
更新:
我使用的是 VS 2010,发布模式,其他一切默认
【问题讨论】:
-
我怀疑您是否进行了全面优化的 C++ 构建。
-
这段代码中没有指针数组...
-
我刚刚对此进行了测试(在一台计算机上使用稍微修改的代码,使用一个特定的编译器)。如果没有优化,“C++ 风格”比“C 风格”慢三分之一。通过优化,“C++ 风格”始终略比“C 风格”更快(两者都比没有优化时快得多)。
-
我的机器上的 C 和 C++ 版本都得到 0.215 秒。 (x86-64 机器上的 GCC 和 G++)。出于某种原因 (.534/.605),C++ 在 32 位上更快。
-
使用 g++ -O3 编译时,两个版本的运行时相同。
标签: c++ c performance optimization