c++ 向量比我的动态数组慢?
Posted
技术标签:
【中文标题】c++ 向量比我的动态数组慢?【英文标题】:c++ vector is slower than my dynamic array? 【发布时间】:2014-02-16 17:54:36 【问题描述】:我已经编写了自己的动态数组。它不完整,我把它写成练习。 但是当我完成添加函数时,我想测试我自己的动态数组类的性能,结果看到了一些奇怪的结果。我的动态数组比 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");
我想知道为什么我的动态数组更快?例如,将一百万个项目添加到向量中大约需要 1000 毫秒,而我的动态数组则不到 150 毫秒!
提前致谢。
编辑: 不要查看代码。这只是一些练习。我只是想知道为什么它比矢量更快。
【问题讨论】:
研究<vector>
标头的源代码。在我的 Linux 系统上,它位于 /usr/include/c++/4.8/vector
中,其中包含来自 /usr/include/c++/4.8/bits/
的多个文件 ...
您是否在打开优化的情况下进行编译?
你编译时开启优化了吗?这对于生成高效的 STL 代码至关重要。
可能是因为您的动态数组包含标准库向量功能的一小部分?
@KooKoo 是的,你可能想检查std::copy
,它应该使用类 operator= 复制对象,对于琐碎的对象使用 memmove/memcpy
【参考方案1】:
那是因为你的数组坏了。您正在使用绕过 operator= 的 memcpy() 移动内容。此外,您的测量在很大程度上是无效的;为了获得准确的比较,您需要重复执行该操作并划分以获得平均时间(并使用足够的迭代来忽略任何噪声)。此外,为了准确比较,您需要针对优化版本进行编译/链接(可能有一个调试版本故意变慢,但提供了额外的检查,您可能无意中使用了这些检查)。
【讨论】:
非常感谢。我针对优化版本进行了编译,它们现在处于同等水平。 确实,如果我用 g++-O3
编译它,即使是作弊,因子也是 DynArray
的 1.5 倍优势。
@KooKoo 您的实现对于类似 POD 的类型来说看起来不错,即。 struct A int a;
或您的示例 int
,我不是这里的专家,但我认为向量实现确实专门针对此类类型,实际上甚至可能为它们执行 memcpy。以上是关于c++ 向量比我的动态数组慢?的主要内容,如果未能解决你的问题,请参考以下文章