gpt4 book ai didi

c++ - std::istream 提取运算符( double 或 float )在 VS 2012 中非常慢

转载 作者:行者123 更新时间:2023-11-28 07:25:07 24 4
gpt4 key购买 nike

我从 VS2008 迁移到 VS2012,我发现 VS2012 版本的性能非常慢。

问题出在输入流的提取运算符上。istream& 运算符>> (float& val);istream& operator>> (double& val);

文本文件上的这些函数在 VS2012 上慢两倍。

例如,以下代码为 VS2012 检索 3.75 秒,而为 VS2008 仅检索 1.25 秒。

你能告诉我为什么吗?

提前致谢。

#include "stdafx.h"
#include <fstream>
#include <sstream>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <sstream>

#define FILE_NAME "D:\\test_Roadmap.txt"

const int NB_VALUE = 1000000;
const int NB_MESURE = 20;

int _tmain(int argc, _TCHAR* argv[])
{
std::cout<<"ecriture"<<std::endl;
//ecriture
{
std::ofstream ostream (FILE_NAME);
float val = 0.f;

for (int ii=0; ii<NB_VALUE; ii++)
{
ostream << val;
ostream << " ";
val += 0.04f;
}

}

std::cout<<"lecture"<<std::endl;
//lecture
double texec = 0;
for (int iMesure=0; iMesure<NB_MESURE; iMesure++)
{
std::ifstream istream (FILE_NAME);
float val = 0;

time_t tbegin1 = time(NULL);

for (int ii=0; ii<NB_VALUE; ii++)
{
istream>> val;
}

time_t tbegin2 = time(NULL);

texec += difftime(tbegin2,tbegin1);

}
texec /= NB_MESURE;

std::ostringstream oss1;
oss1 << texec;
std::string s1 = std::string(" read : ") + oss1.str() + std::string(" in s");
std::cout<<s1<<std::endl;

float a;
std::cin>>a;

return 0;
}

最佳答案

下面的链接指出提取运算符“从流中按顺序提取和解析字符,以将它们解释为正确类型的值的表示。”

http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/

所以我认为在 VS2012 中提取运算符到 float 或 double 值的实现非常慢,因为它是按顺序将字符解析和解释为数字。最近,我在 VS2012 中遇到了同样的问题,而代码在 VS2010 编译中运行速度提高了 7 倍。通过将提取运算符“>>”与 char[] 而不是 double 或 float 一起使用,然后使用 atof() 获取 double 值,我能够解决这个问题。

下面是对我有用的代码片段,

char inStr[64];
float val = 0;

std::ifstream istream (FILE_NAME);

istream >> inStr;
val = atof(inStr);

关于c++ - std::istream 提取运算符( double 或 float )在 VS 2012 中非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18895859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com