我需要在一个文件中输出一个双精度值。
所以对于我所有的其他字符串,我必须输出,我使用fputs,因为我认为fputs比fprintf快。
但是如果我想输出双倍的值,我不能用fputs做这个,所以我尝试了fprintf。这太慢了。如果我更换fprintf并放上fputs(“测试”,文件),我需要更多的时间;
我怎么能像绳子一样快地把双份的东西拿出来。我需要先把它转换成字符串吗?
我发现了一些转变。但如果我使用它们,我就慢得像使用fprintf一样。
那么,我怎么能像在一个文件上放一个字符串那样快地把double放到一个文件上呢?

  fputs("TEST",fileout); //FAST
  fprintf(fileout, "%f",p); //SLOW

编辑:
使用fprintf double的次数:
END.PROCESSING.DATA: 2013-04-26 08:10:33.000
END.CALC.IN.FILE: 2013-04-26 08:11:13.000

使用fputs字符串的时间:
END.PROCESSING.DATA: 2013-04-26 08:14:10.000
END.CALC.IN.FILE: 2013-04-26 08:14:37.000

当时的代码是:
now = time (0);
strftime (buff, 100, "%Y-%m-%d %H:%M:%S.000", localtime (&now));
printf ("END.PROCESSING.DATA: %s\n", buff);

//output file
FILE *fileout;
fileout = fopen("out.txt","w");
double p;
for(i=0; i<17000;i++){
  for(j=0; j<i;j++){
    for(z=0;z<400;z++){
      //DO SOME WORK
    }
    p = 1.0;
    fputs(allsubsts[i],fileout);
    fputs(";",fileout);
    fputs(allsubsts[j],fileout);
    fputs(";",fileout);
    //fprintf(fileout, "%.21g", p);
    fputs("TEST",fileout);
    fputs(";\n",fileout);
  }
}
fclose(fileout);

now = time(0);
strftime(buff,100,"%Y-%m-%d %H:%M:%S.000", localtime(&now));
printf("END.CALC.IN.FILE: %s\n",buff);

两个时间之间的更改只是我在文件中放置了double而不是测试字符串的更改。

最佳答案

将浮点数转换为十进制表示形式是一项非常缓慢的操作。您可以尝试使用%a说明符而不是%f将其存储为十六进制浮点;这应该快得多,并且可以安全地保存原始值而不是差的近似值。如果您需要十进制,您应该使用%.21g或类似的,而不是%f,因为后者将丢失大部分精度。
如果这些都不够快,那么您可能需要直接保存值的二进制表示。

关于c - fputs与fprintf和double,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16218614/

10-11 21:57