在循环中初始化一个数组

时间:2013-06-13 14:50:29

标签: c++ sorting

所以,我是c ++的初学者,我想比较使用模板的冒泡排序的执行时间和少量元素的经典函数(N = 2,4,6,8,10,12,16) 。因为N是如此之小,我循环函数说1000000次以获得可测量的结果。我是这样做的:

main() { 

int t1, t2, h, m, s,k=0;
    int a[4] = {800,768,700,652};

t1=GetTickCount();

for (k=0; k<1000000; k++){
// bubble_sort_template<4>(a);
   bubble_sort_function(a,4);
}
t2=GetTickCount() - t1;

结果不像我预期的那样,因为当我第二次运行循环时,我的数组已经排序了。如何在循环星形之前再次初始化数组?

3 个答案:

答案 0 :(得分:3)

在循环中移动数组定义:

for (k=0; k<1000000; k++) {
  int a[4] = {800, 768, 700, 652};
  bubble_sort_function(a,4);
}

这样,每次执行循环时,都使用的是原始数组。

此外,在比较性能时需要注意两点:

  • 模板化和非模板化版本不太可能具有不同的性能行为。在编译时期间,编译器根据类型参数生成不同的函数。因此,当您测试该函数时,您实际上正在运行相同的代码。
  • 当你比较不同算法的性能时,一个小输入(在这种情况下是小数组)通常是不够的,因为两者都运行得非常快。您最好尝试使用更大的输入来放大算法之间的差异。

这可以解释为什么你会得到不同版本的类似结果。

答案 1 :(得分:1)

尝试:

main() { 

int t1, t2, h, m, s,k=0;


t1=GetTickCount();

for (k=0; k<1000000; k++){
  int a[4] = {800,768,700,652};
// bubble_sort_template<4>(a);
   bubble_sort_function(a,4);
}
t2=GetTickCount() - t1;

答案 2 :(得分:1)

难道你不能只将初始化语句移动到循环体中吗?以下编译对我来说很好(作为C ++):

extern void bubble_sort_function(int *, int);

main()
{
    for (int k=0; k<1000000; k++){
        int a[4] = {800,768,700,652};
        bubble_sort_function(a,4);
   }
}