vector运行速度慢!解决方法
vector运行速度慢!!
从文件中读取数据,保存在二维数组中,但是整个程序运行起来要27.55秒。有没有办法提高push_back的运行速度吗?我是新手,请大神指教。
------解决方案--------------------
用reserve(),此外尽量避免容器类嵌套使用
push_back是最简单的用法,稍微想想它的原理就知道对于多一点的数据肯定快不起来
------解决方案--------------------
1. input.read()可以一次多读点数据,减少读取次数;
2. 那个只有三次的循环,没有必要,直接把push_back写三次就行了;
3. 不管怎么优化,都不如首先取得数据大小,然后一次性分配足够内存,一次性将所有数据全部读入来得快。
------解决方案--------------------
减少内存分配次数, 减少内存拷贝次数,减少IO请求次数。
------解决方案--------------------
vector<vector<float> > w1; 这样的东西, 速度也会大受影响. vector里面最好只保存基本数据类型和指针.
------解决方案--------------------
依我自己的观点:
1.I/0操作过多!!!大量的I/0操作明显降低计算机性能
2.迭代器嵌套。我个人觉得迭代器里不适合保存非基本类型,尤其是嵌套的情况。一般保存基本类型或者分基本类型的指针
#include<iostream>
#include<fstream>
#include<vector>
#include<time.h>
using namespace std;
int main()
{
float input_Buf[3];
vector<vector<float> > w1;
//for(int i=0;i!=10;++i)
//{
// w1[i].resize(3);
//}
clock_t start=clock();
ifstream input("P.dat",ifstream::binary);
for(int i=0;i!=1030301;++i)
{
w1.push_back(vector<float>());
input.read((char*)input_Buf,3*sizeof(float));
for(int j=0;j!=3;++j)
{
//w1[i].push_back(input_Buf[j]);
w1.back().push_back(input_Buf[j]);
}
}
input.close();
clock_t finish=clock();
cout<<"运算时间为: "<<float(finish-start)/CLOCKS_PER_SEC<<"秒!"<<endl;
return 0;
}
从文件中读取数据,保存在二维数组中,但是整个程序运行起来要27.55秒。有没有办法提高push_back的运行速度吗?我是新手,请大神指教。
------解决方案--------------------
用reserve(),此外尽量避免容器类嵌套使用
push_back是最简单的用法,稍微想想它的原理就知道对于多一点的数据肯定快不起来
------解决方案--------------------
1. input.read()可以一次多读点数据,减少读取次数;
2. 那个只有三次的循环,没有必要,直接把push_back写三次就行了;
3. 不管怎么优化,都不如首先取得数据大小,然后一次性分配足够内存,一次性将所有数据全部读入来得快。
------解决方案--------------------
减少内存分配次数, 减少内存拷贝次数,减少IO请求次数。
#include<iostream>
#include<fstream>
#include<vector>
#include<time.h>
using namespace std;
int main()
{
struct Val
{
float input_Buf[3];
} ;
vector<Val > w1(1030301);
Val* p = &w[0];
clock_t start=clock();
ifstream input("P.dat",ifstream::binary);
int i=0, sz = w1.size() / 32 * 32;
for(; i < sz; i+= 32)
{
input.read((char*)p[i].input_Buf, 32 * 3*sizeof(float));
}
sz = w1.size() ;
for(; i < sz; ++i)
{
input.read((char*)p[i].input_Buf, 3*sizeof(float));
}
clock_t finish=clock();
cout<<"运算时间为: "<<float(finish-start)/CLOCKS_PER_SEC<<"秒!"<<endl;
return 0;
}
------解决方案--------------------
vector<vector<float> > w1; 这样的东西, 速度也会大受影响. vector里面最好只保存基本数据类型和指针.
------解决方案--------------------
依我自己的观点:
1.I/0操作过多!!!大量的I/0操作明显降低计算机性能
2.迭代器嵌套。我个人觉得迭代器里不适合保存非基本类型,尤其是嵌套的情况。一般保存基本类型或者分基本类型的指针