C++ C++;file.close()提供了额外的时间

C++ C++;file.close()提供了额外的时间,c++,file,ifstream,C++,File,Ifstream,我从一个文件(大约占用2GB磁盘空间)读取到一个向量v中的大约2.3亿个浮点值。然后,我为所有有效的I创建t[I]=(&(v[I][0])。该t然后转到函数f的输入。我有两种方法可以做到这一点: if(file.is_open()){ while(...) // read floats into v } else{ // something } // create t // start timer // run function f(t) // end timer 及

我从一个
文件
(大约占用
2GB
磁盘空间)读取到一个
向量v
中的大约2.3亿个浮点值。然后,我为所有有效的
I
创建
t[I]=(&(v[I][0])
。该
t
然后转到函数
f
的输入。我有两种方法可以做到这一点:

if(file.is_open()){
    while(...)
    // read floats into v
}
else{
    // something
}
// create t
// start timer
// run function f(t)
// end timer

第一次进近约需37秒,第二次进近约需49秒

我的问题是:为什么会这样?我只在代码执行函数
f
时对代码计时,那么为什么我会得到如此显著的差异呢


编辑

守则如下:

int n = 114141986; // number of data points
int d = 2;
vector<float> temp;
for(int i=0; i<d; i++)
    temp.push_back(0);
vector<vector<float>> data(n, temp);
string path = "cleanedData/"+to_string(d)+"d1.txt";
ifstream file(path.c_str());
if(file.is_open()){
    int j = 0;
    string line;
    while(getline(file, line)){
        istringstream in(line);
        for(int i=0; i<d; i++){
            in>>data[j][i];
        }
        j++;
    }
    file.close();
}
else{
    cout<<"Unable to open file "<<path<<endl;
    exit(1);
}
vector<float*> vec(n);
for(int i=0; i<n; i++){
    vec[i] = (&(data[i][0]));
}
cout<<"Done"<<endl;
// to check time taken to build the tree
time_t start, end; 
time(&start); 
cout<<"Building tree..."<<endl;
node *root = buildTree(vec);
time(&end); 
int n=114141986;//数据点数量
int d=2;
向量温度;
对于(int i=0;idata[j][i];
}
j++;
}
file.close();
}
否则{

“我想我们还需要再看一点代码才能更好地了解这里的情况。@AdrianMole当然可以。请告诉我,测试是在启用优化的情况下编译的吗?另外,我向您保证,与读取一行代码,然后用
istringstream
重新解析其中的值相比,性能影响可以忽略不计。只需从中提取值即可。”如果不需要锯齿波,那么向量可能会更好arrays@AnkitKumar是的,
>
东西是任何
istream
ifstream
istringstream
cin
,等等).至于速度,您是否尝试将类型更改为
vector
?这将避免每行一次动态分配,并将提高缓存内聚性。如果您使用gcc/g++/clang/clang++,则可以使用
-O3
选项启用优化。msvc使用
/O2
启用编译器优化并获得很好的速度提升。我认为我们“我需要再看一点代码,才能对这里发生的事情有一个好的了解。@AdrianMole当然可以。请告诉我,测试是在启用优化的情况下编译的吗?另外,我向您保证,与读取一行代码,然后用
istringstream
重新解析其中的值相比,性能影响可以忽略不计。只需直接将这些值取出并看看这有多快。另外,如果不需要锯齿波,向量可能会更好arrays@AnkitKumar是的,
>
东西是任何
istream
ifstream
istringstream
cin
,等等).至于速度,您是否尝试将类型更改为
vector
?这将避免每行一次动态分配,并将提高缓存内聚性。如果您使用gcc/g++/clang/clang++,则可以使用
-O3
选项启用优化。msvc使用
/O2
启用编译器优化并获得良好的速度提升。
int n = 114141986; // number of data points
int d = 2;
vector<float> temp;
for(int i=0; i<d; i++)
    temp.push_back(0);
vector<vector<float>> data(n, temp);
string path = "cleanedData/"+to_string(d)+"d1.txt";
ifstream file(path.c_str());
if(file.is_open()){
    int j = 0;
    string line;
    while(getline(file, line)){
        istringstream in(line);
        for(int i=0; i<d; i++){
            in>>data[j][i];
        }
        j++;
    }
    file.close();
}
else{
    cout<<"Unable to open file "<<path<<endl;
    exit(1);
}
vector<float*> vec(n);
for(int i=0; i<n; i++){
    vec[i] = (&(data[i][0]));
}
cout<<"Done"<<endl;
// to check time taken to build the tree
time_t start, end; 
time(&start); 
cout<<"Building tree..."<<endl;
node *root = buildTree(vec);
time(&end);