std::istream 提取运算符(双精度或浮点数)在 VS 2012 中非常慢
std::istream extract operator (double or float) are very slow in VS 2012
我从VS2008迁移到VS2012,我看到VS2012版本的性能非常慢。
问题出在输入流的提取运算符中。iStream&Operator>>(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中实现提取运算符以浮点数或双精度值非常慢,因为它是按顺序解析和解释字符为数字。最近,我在VS2012中遇到了同样的问题,而代码在VS2010编译中的运行速度提高了7倍。我能够通过使用带有 char[] 而不是双精度或浮点数的提取运算符">>"来解决这个问题,然后使用 atof() 来获取双精度值。
下面是对我有用的代码片段,
char inStr[64];
float val = 0;
std::ifstream istream (FILE_NAME);
istream >> inStr;
val = atof(inStr);
相关文章:
- 如何配置VS 2012的编译器来更改基本数据类型大小?
- vs 2012 Ultimate Update 4不会编译数组
- 如何将QT5和QT Creator 2.6.1与VS 2012中的编译器一起使用
- VS 2012不生成依赖项目
- VS 2012 - XP Issues
- VS 2012 上的绒毛石无法编译
- 崩溃当std ::函数是从lambda返回的VS 2012中返回的值时的崩溃
- 在Windows上运行C 应用程序的必要条件,并从VS 2012中获取XP定位
- C++/VS 2012-多项目解决方案:一个项目中存在链接器错误,但另一个项目没有
- SQLAPI++ in VS 2012
- VS 2012-由于缺少工具集,项目未能生成
- 在VS 2012上编译,但不使用Netbeans/MinGW-重载<<
- 对话框窗口中的MessageBox(VS 2012,MFC C++)
- VS 2012模板错误
- VS 2012 调试 处理<文件时出现意外的符号读取器错误.exe>
- VS 2012 中可能有什么变化来破坏我的C++应用程序?
- 修改 VS 2012 C++标题模板
- Cstring 在 VS 2012 中不起作用,但如果使用 VS 2012 打开 VC++ 6.0 项目,则可以工作
- 可视化 如何在VS 2012 Express中使用C++自动化Outlook
- VS 2012 Error LNK2019