gpt4 book ai didi

c++ - 在 C++ 中从文本文件中读取数值的最快方法(在这种情况下为 double )

转载 作者:IT老高 更新时间:2023-10-28 22:23:01 25 4
gpt4 key购买 nike

目前,我的代码是这样的:

void ReadFile(double Cst[][1000], char* FileName, int height)

FILE* ifp;
double value;
int nRead = 0;
int mRead = 0;

//open the file, check if successful
ifp = fopen( FileName, "r" );
if (ifp==NULL){
...
}


for (nRead = 0; nRead < height; nRead++){
for (mRead = 0; mRead < 1000; mRead++){
fscanf(ifp, "%le",&value);
Cst[nRead][mRead]=value;
}
}

fclose(ifp);

我可以进行哪些更改以使其最快?

最佳答案

Boost . Spirit . QI附带 benchmark比较 std::atofstd::strtodboost::spirit::qi::double_ 的性能。以下是在我的系统上使用 VC++ 2010 SP1 x64 和 Boost 1.46.1 的结果:

atof_test: 4.1579 seconds
strtod_test: 4.2339 seconds
spirit_qi_double_test: 1.2822 seconds

这使 Spirit.QI 比第二快可验证*选项和230%>224% 快 比下一个最快的无法验证的选项 - 相当快,我会说!

*std::atof 不同,std::strtod 和 Boost.Spirit 会让你知道输入有效。


更新:我重新运行了基准测试,另外还使用了 Boost . Spirit . X3boost::spirit::x3::double_;这是我目前系统上的结果,使用 VC++ 2015 Update 3 x64 和 Boost 1.61.0:

atof_test: 2.2874 seconds
strtod_test: 2.2923 seconds
spirit_qi_double_test: 0.4849 seconds
spirit_x3_double_test: 0.4308 seconds

这使 Spirit.QI 比第二快的可验证选项快 373%,比第二快的不可验证选项快 372%,Spirit.X3 比第二快的可验证选项快 432%并且比下一个最快的无法验证的选项快 431% - Spirit 的情况得到了显着改善显着,最重要的是,基于 X3 的代码在大约 1/5 的时间内编译作为基于 QI 的代码,因此也赢得了所有的胜利!

此外,我已经对 @Potatoswatter's answer 中的代码进行了基准测试。 (修改了 double 指数表并支持负数(code)),@6502's answer , 和 @Mehrdad's answer ,具有相同的构建和测试环境。以下是结果(@6502 的代码被排除在外,因为我的样本输入中有一半使用科学记数法,他的代码不支持):

potatoswatter_test: 0.2358 seconds
mehrdad_test: 0.3415 seconds

如果所有输入都转换为固定符号,我们也可以测试@6502的代码:

atof_test: 3.6249 seconds
strtod_test: 3.7023 seconds
spirit_qi_double_test: 1.0763 seconds
spirit_x3_double_test: 2.3657 seconds
potatoswatter_test: 0.8347 seconds
6502_test: 4.1463 seconds
mehrdad_test: 1.3471 seconds

有趣的一点是 QI 无法解析一些非常长的固定符号输入; X3 可以正确解析这些内容,但运行速度明显慢于短科学记数法输入。

关于c++ - 在 C++ 中从文本文件中读取数值的最快方法(在这种情况下为 double ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5678932/

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