当前位置: 首页 > 知识库问答 >
问题:

填充整数列表比填充整数向量快100倍

宰父远
2023-03-14

我正在比较填充整数列表所需的时间与整数向量。

每个矢量

令我惊讶的是,填充列表比填充整数向量快100倍。我希望填充整数的向量要快得多,因为向量在内存中是连续的,插入要快得多。

填充列表怎么会比填充向量快100倍而不是10倍呢?我肯定我缺少一些导致这种情况的概念或想法。

这是我用来生成结果的代码

#include <iostream>
#include <sstream>
#include <list>
#include <vector>
#include <ctime>
#include <time.h>

using namespace std;



int main()
{
   list<int> mylist;
   vector<int> myvector;
   srand(time(NULL));
   int num;

   clock_t list_start;
   clock_t list_end;
   clock_t list_totaltime;

   for (int i=0;i<100;i++)
   {

    list_start = clock();

        for (int i = 0 ; i < 10000000 ; i++ ) // 10 million
        {    
            num = rand() % 10000000 ; 

            mylist.push_back(num);
         }

    list_end = clock();

    list_totaltime += difftime(list_end,list_start);

    mylist.clear();

   }

   cout << list_totaltime/CLOCKS_PER_SEC/100;

   cout <<" List is done ";

   cout << endl
        << endl;

   clock_t vector_start;  
   clock_t vector_end;
   clock_t vector_totaltime;

   for (int i=0;i<100;i++)
   {

    vector_start = clock();

        for (int i = 0 ; i < 10000000 ; i++ ) // 10 million times
        {    
            num = rand() % 10000000 ; 

            myvector.push_back(num);
        }

    vector_end = clock();

    vector_totaltime += difftime(vector_end,vector_start);

    myvector.clear();

    }

   cout << vector_totaltime/CLOCKS_PER_SEC/100;

   cout << " Vector is done " ;


}

有人能给我解释一下为什么会这样吗???

共有3个答案

宋华灿
2023-03-14

郑重声明,在修复未初始化的变量问题和整数除法后,在x86_64和以下标志上运行使用gcc 4.7.3编译的优化版本

g -墙 -韦斯特拉 -迂腐-误差 -pthread -std=c 11 -O3

我明白了

0.2 List is done 
0.07 Vector is done

正如我所料,向量更快了。这不需要对代码做任何进一步的修改。

周弘毅
2023-03-14

有人能给我解释一下为什么会这样吗???

结果不是实数,即填充整数列表并不比填充整数向量快100倍。您看到的是由于注释中指出的代码错误而导致的基准测试工件。

如果您初始化变量并避免整数除法,那么您应该会看到不同的结果,例如,在我的机器上填充向量比填充列表快3倍(顺便说一句,调用向量::保留()对结果没有影响)。

相关:未初始化变量和编译器(GCC)的乐趣。

此外,不应将< code>difftime(time_t,time_t)与< code>clock_t值一起使用。

哈扬
2023-03-14

我用VS2013 C编译器试了一下,< code>std::vector比< code>std::list快多了(如我所料)。

我得到了以下结果:

Testing STL vector vs. list push_back() time
--------------------------------------------

Testing std::vector...done.
std::vector::push_back(): 89.1318 ms

Testing std::list...done.
std::list::push_back(): 781.214 ms

我使用Windows高分辨率性能计数器来测量时间。< br >当然,我在优化发布版本中进行了测试。

我还重构了推回循环中的随机数生成,并使用了比rand()更严肃的随机数技术。

您使用< code>clock()来测量执行时间的方法好吗?

你用的是什么C编译器?你测试过优化的版本吗?

可编译的测试代码如下:

// Testing push_back performance: std::vector vs. std::list

#include <algorithm>
#include <exception>
#include <iostream>
#include <list>
#include <random>
#include <vector>
#include <Windows.h>
using namespace std;

long long Counter() {
    LARGE_INTEGER li;
    QueryPerformanceCounter(&li);
    return li.QuadPart;
}

long long Frequency() {
    LARGE_INTEGER li;
    QueryPerformanceFrequency(&li);
    return li.QuadPart;
}

void PrintTime(const long long start, const long long finish, 
               const char * const s) {
    cout << s << ": " << (finish - start) * 1000.0 / Frequency() << " ms" << endl;
}

int main() {
    try {
        cout << endl
            << "Testing STL vector vs. list push_back() time\n"
            << "--------------------------------------------\n"
            << endl;

        const auto shuffled = []() -> vector<int> {
            static const int kCount = 10 * 1000 * 1000;

            vector<int> v;
            v.reserve(kCount);

            for (int i = 1; i <= kCount; ++i) {
                v.push_back((i % 100));
            }

            mt19937 prng(1995);
            shuffle(v.begin(), v.end(), prng);

            return v;
        }();

        long long start = 0;
        long long finish = 0;

        cout << "Testing std::vector...";
        start = Counter();
        vector<int> v;
        for (size_t i = 0; i < shuffled.size(); ++i) {
            v.push_back(shuffled[i]);
        }
        finish = Counter();
        cout << "done.\n";
        PrintTime(start, finish, "std::vector::push_back()");

        cout << endl;

        cout << "Testing std::list...";
        start = Counter();
        list<int> l;
        for (size_t i = 0; i < shuffled.size(); ++i) {
            l.push_back(shuffled[i]);
        }
        finish = Counter();
        cout << "done.\n";
        PrintTime(start, finish, "std::list::push_back()");
    } catch (const exception& ex) {
        cout << "\n*** ERROR: " << ex.what() << endl;
    }
}
 类似资料:
  • 问题内容: 我需要用0填充整数部分,该整数部分必须至少包含2个字符 是否有简单的代码? 如果可能的话在Java中也一样 不仅难看而且可以打印02.10999999999999988 问题答案: 您也可以使用函数来填充整数: 类似于(键盘):

  • 我正在制作一个使用tableView的程序。一切都进行得很顺利,只是由于某些原因,我无法获得要填充到表中的整数值。下面是我在主程序中的代码,当我运行程序时,字符串和Double填充,但整数没有。在我的产品类中,sku是int。不太确定哪里出了问题,寻找一些洞察力! 这里是发票对象和添加产品。

  • 问题内容: 我想要一个包含1到500范围内的整数的列表。是否有某种方法可以使用Guava(或只是纯Java)创建此列表,而不必遍历该范围并将值分别添加到我自己的列表中码? 问题答案: 使用番石榴,您可以诉诸于:http : //docs.guava- libraries.googlecode.com/git/javadoc/com/google/common/collect/Range.html

  • 我想在一行中用n个整数填充一个列表,我试过了,但如何增加n的限制?

  • 到目前为止,这就是我得到的,但我不太确定接下来该怎么办。我(认为)这里发生的是,它到达数组的第一个位置,在0,0处,并生成一个数字。然后转到1,1和2,2,依此类推。我不确定该从那里开始,我相信有一种更有效的方法可以一次填充整行或整列。 此外,我的编译器不允许我像平时一样使用cout或endl?它坚持我使用std::cout,我只是想知道为什么。

  • 问题内容: 如何用一个列表提供的数据填充数组? 例如,我有一个包含字符串的列表: 然后我想将此数据复制到String数组中: 问题答案: list中有一个toArray()方法… 您必须首先分配一个适当大小的数组(通常为list.size()),然后将其作为参数传递给toArray方法。该数组将使用列表内容初始化。 例如: 您也可以在toArray的括号内进行新调用