c++ - 为什么动态数组比静态数组慢

标签 c++

在我当前的项目中,我需要对大型数据数组进行操作。 所以我做了一个愚蠢的测试来检查哪个更好,但是在尝试下面的代码时我发现动态数组比静态数组慢得多,为什么这样呢?还是我做错了什么?

这里是代码(我从这里删除了 vector (执行等于动态)和增强数组(等于静态))

结果:静态 8,动态 7493

#include<iostream>
#include<vector>


using namespace std;
using namespace boost;
double arr_time;
double darr_time;

void arrr()
{
int arr[100000];
LARGE_INTEGER start,end;
QueryPerformanceCounter(&start);

for(int i=0 ; i <100000 ; ++i)
{
    arr[i] = 10 ;
}
for(int i=0 ; i <100000 ; ++i)
{
    int x = arr[i];
}
QueryPerformanceCounter(&end);

arr_time += (end.LowPart - start.LowPart);
}

void darr()
{
int *arr = new int[100000];
LARGE_INTEGER start,end;
QueryPerformanceCounter(&start);

for(int i=0 ; i <100000 ; ++i)
{
    arr[i] = 10 ;
}
for(int i=0 ; i <100000 ; ++i)
{
    int x = arr[i];
}
QueryPerformanceCounter(&end);

darr_time += (end.LowPart - start.LowPart);

delete[] arr;
}

int main(int argc, char** argv)
{
for(int i= 0 ; i <100 ; ++i)
{
    arrr();
    darr();

}
cout<<"\n--------------------\n";
cout<<arr_time<<endl;
cout<<darr_time<<endl;
  return 0;
}

最佳答案

您的代码不会对其计算的值执行任何操作,从而允许编译器将您的代码优化为空。例如,编译器可能会变成这样:

void arrr()
{
  int arr[100000];
  LARGE_INTEGER start,end;
  QueryPerformanceCounter(&start);

  for(int i=0 ; i <100000 ; ++i)
  {
      arr[i] = 10 ;
   }
  for(int i=0 ; i <100000 ; ++i)
  {
      int x = arr[i];
  }
  QueryPerformanceCounter(&end);

  arr_time += (end.LowPart - start.LowPart);
}

进入这个:

void arrr()
{
  LARGE_INTEGER start,end;
  QueryPerformanceCounter(&start);

  QueryPerformanceCounter(&end);

  arr_time += (end.LowPart - start.LowPart);
}

在静态数组代码中,编译器可以告诉内存不再被访问,因为一旦函数返回,它的堆栈就会消失。在动态情况下,它不能,因为它不知道一旦内存被释放,它的值就无关紧要了。第一个循环可能必须保留,但第二个循环可能在动态情况下被完全删除。

您没有衡量您认为正在衡量的东西。

你可以尝试这样的事情:

void arrr()
{
  int arr[100000];
  LARGE_INTEGER start,end;
  QueryPerformanceCounter(&start);

  for(int i=0 ; i <100000 ; ++i)
  {
      arr[i] = 10 ;
  }
  int x = 0;
  for(int i=0 ; i <100000 ; ++i)
  {
      x += arr[i];
  }
  QueryPerformanceCounter(&end);

  arr_time += (end.LowPart - start.LowPart);
  cout << "x = " << x << endl;
}

还有一个区别。在静态数组的情况下,编译器知道没有外部函数(如 QueryPerformanceCounter)可以依赖或修改数组的内容。在动态情况下,它不知道。 QueryPerformanceCounter 的位置可以相对于循环进行更改。例如,编译器可以将对 QueryPerformanceCounter 的两个调用一起移动到循环之后,在静态情况下而不是在动态情况下。 (除非 Microsoft 使用一些技巧来防止这种情况。)

关于c++ - 为什么动态数组比静态数组慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13668697/

相关文章:

c++ - 如何在 C/C++ 中包含宏的行的末尾添加语句?

c++ - C++ 中的字符串连接

java - 有人可以确认我的双调序列算法中的最小元素是否正确吗?

c++ - 将所有成员从一个结构复制到另一个结构

c++ - 函数的内联版本返回的值与非内联版本不同

c++ - 不匹配运算符,为什么这段代码没有得到 cin?

c++ - 为什么之前没有在类定义的末尾声明对象;就像为 C/C++ 中的结构所做的那样?

c++ - 在哪里下载 GNU C++ 编译器

C++ 访问尚未定义的模板参数成员

c++ - 用于函数调用捕获的 Lua 元表