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 毫秒!

提前致谢。

编辑: 不要查看代码。这只是一些练习。我只是想知道为什么它比矢量更快。

【问题讨论】:

研究&lt;vector&gt; 标头的源代码。在我的 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++ 向量比我的动态数组慢?的主要内容,如果未能解决你的问题,请参考以下文章

(C++) 创建可以从函数访问的动态全局数组/向量

动态分配 SIMD 向量数组是不是安全?

[C++ STL] vector使用详解

使用向量类实现堆栈的链表与动态数组

动态数组 C++,新 Obj[size] 的麻烦只创建 1 个对象指针,而不是数组

用向量填充c ++中的简单动态数组[重复]