我已经编写了自己的动态数组。它不完整,我已经把它写成了一种做法。 但是当我完成add函数时,我想测试我自己的动态数组类的性能,我看到了一些奇怪的结果。我的动态数组比stl的向量快得多。它快了7倍!
这是我的代码:
#include<iostream>
#include<vector>
#include<Windows.h>
using namespace std;
template<class T>
class DynArray
{
public:
DynArray()
{
arr = new T[2];
capacity = 2;
size = 0;
}
void Add(T value)
{
if(size < capacity)
{
arr[size++] = value;
}
else
{
T* tempArr = arr;
arr = new T[capacity*2];
memcpy(arr,tempArr,capacity*sizeof(T));
capacity = capacity*2;
delete[] tempArr;
arr[size++] = value;
}
}
int GetCapacity()
{
return capacity;
}
T operator [] (int index)
{
return arr[index];
}
~DynArray()
{
delete[] arr;
}
private:
T* arr;
int capacity;
int size;
};
void main()
{
int c;
cin >> c;
DynArray<int> d;
int a = GetTickCount();
for(int i = 0;i < c;i++)
d.Add(i);
cout << "\n" << GetTickCount() - a << "\n\n";
vector<int> v;
a = GetTickCount();
for(int i = 0;i < c;i++)
v.push_back(i);
cout << "\n" << GetTickCount() - a << '\n';
cout << d.GetCapacity() << ',' << v.capacity() << "\n\n";
system("pause");
}
我想知道为什么我的动态数组更快?例如,向量添加100万个项目大约需要1000毫秒,而动态数组小于150毫秒!
提前致谢。
修改 不要查看代码。这只是一些练习。我只是想知道为什么它比矢量更快。
答案 0 :(得分:8)
那是因为你的阵列坏了。您正在使用绕过operator =的memcpy()移动内容。此外,您的测量基本上无效;为了获得准确的比较,您需要重复执行操作并除以获得平均时间(并使用足够的迭代来忽略任何噪声)。另外,为了准确地进行比较,您需要针对优化版本进行编译/链接(可能有一个调试版本有意地较慢但提供了额外的检查,您可能无意中使用了这些版本。)