我正在比较填充整数列表所需的时间与整数向量。
每个矢量
令我惊讶的是,填充列表比填充整数向量快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 " ;
}
有人能给我解释一下为什么会这样吗???
郑重声明,在修复未初始化的变量问题和整数除法后,在x86_64和以下标志上运行使用gcc 4.7.3编译的优化版本
g -墙 -韦斯特拉 -迂腐-误差 -pthread -std=c 11 -O3
我明白了
0.2 List is done
0.07 Vector is done
正如我所料,向量更快了。这不需要对代码做任何进一步的修改。
有人能给我解释一下为什么会这样吗???
结果不是实数,即填充整数列表并不比填充整数向量快100倍。您看到的是由于注释中指出的代码错误而导致的基准测试工件。
如果您初始化变量并避免整数除法,那么您应该会看到不同的结果,例如,在我的机器上填充向量比填充列表快3倍(顺便说一句,调用向量::保留()
对结果没有影响)。
相关:未初始化变量和编译器(GCC)的乐趣。
此外,不应将< code>difftime(time_t,time_t)与< code>clock_t值一起使用。
我用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的括号内进行新调用