c语言浮点数分割,如何快速解析C ++中以空格分隔的浮点数?

如果转换是瓶颈(这很可能),您应该首先使用标准中的不同可能性。从逻辑上讲,人们会期望它们非常接近,但实际上,它们并不总是:你已经确定std::ifstream太慢了。

将内存映射数据转换为a std::istringstream 几乎肯定不是一个好的解决方案; 您首先必须创建一个字符串,它将复制所有数据。

编写自己streambuf的内容直接从内存中读取,无需复制(或使用已弃用的std::istrstream)可能是一种解决方案,但如果问题确实是转换......这仍然使用相同的转换例程。

您可以随时尝试fscanf,或scanf在您的内存映射流上。根据实现,它们可能比各种istream实现更快。

可能比任何这些都要快strtod。无需为此进行标记:strtod跳过前导空格(包括'\n'),并且具有out参数,其中放置第一个未读取的字符的地址。结束条件有点棘手,你的循环可能看起来有点像:char * begin; //设置为指向mmap的数据...

//你还必须安排一个'\ 0'

//跟踪数据 这可能是

//最困难的问题

char * end;

errno = 0;

double tmp = strtod(开始,结束);

while(errno == 0 && end!= begin){

//用tmp做任何事情......

begin = end;

tmp = strtod(开始,结束);

}

如果这些都不够快,您将不得不考虑实际数据。它可能有一些额外的约束,这意味着你可以编写一个比一般更快的转换例程; 例如strtod,必须处理固定和科学,即使有17位有效数字,它必须100%准确。它还必须是特定于语言环境的。所有这些都增加了复杂性,这意味着需要添加代码来执行。但要注意:编写一个有效且正确的转换例程,即使对于一组有限的输入,也是非常重要的; 你真的必须知道你在做什么。

编辑:

出于好奇,我进行了一些测试。除了前面提到的解决方案之外,我还编写了一个简单的自定义转换器,它只处理固定点(不科学),小数点后最多五位数,小数点前的值必须符合int:doubleconvert( char const* source, char const** endPtr ){

char* end;

int left = strtol( source, &end, 10 );

double results = left;

if ( *end == '.' ) {

char* start = end + 1;

int right = strtol( start, &end, 10 );

static double const fracMult[]

= { 0.0, 0.1, 0.01, 0.001, 0.0001, 0.00001 };

results += right * fracMult[ end - start ];

}

if ( endPtr != nullptr ) {

*endPtr = end;

}

return results;}

(如果你真的使用它,你肯定应该添加一些错误处理。这只是为了实验目的而迅速被淘汰,读取我生成的测试文件,没有 别的。)

接口正好是strtod简化编码的接口。

我在两个环境中运行基准测试(在不同的机器上,所以任何时候的绝对值都不相关)。我得到了以下结果:

在Windows 7下,使用VC 11(/ O2)编译:Testing Using fstream directly (5 iterations)...

6.3528e+006 microseconds per iterationTesting Using fscan directly (5 iterations)...

685800 microseconds per iterationTesting Using strtod (5 iterations)...

597000 microseconds per iterationTesting Using manual (5 iterations)...

269600 microseconds per iteration

在Linux 2.6.18下,使用g ++ 4.4.2(-O2,IIRC)编译:Testing Using fstream directly (5 iterations)...

784000 microseconds per iterationTesting Using fscanf directly (5 iterations)...

526000 microseconds per iterationTesting Using strtod (5 iterations)...

382000 microseconds per iterationTesting Using strtof (5 iterations)...

360000 microseconds per iterationTesting Using manual (5 iterations)...

186000 microseconds per iteration

在所有情况下,我正在读取554000行,每行有3个随机生成的浮点数[0...10000)。

最引人注目的是之间的巨大的差异 fstream和fscanWindows下(与之间的差异相对较小fscan和strtod)。第二件事是两个平台上简单的自定义转换功能获得了多少。必要的错误处理会使其减慢一点,但差异仍然很大。我期待一些改进,因为它不能处理标准转换例程所做的很多事情(比如科学格式,非常非常小的数字,Inf和NaN,i18n等),但不是这么多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值