我需要在文件中输出一个double值。 所以对于我所有的其他字符串我必须推出我使用fputs因为我认为并定时fputs比fprintf快。
但是,如果我想推出双值,我不能用fputs这样做,所以我尝试了fprintf。这很慢。我需要更多时间,如果我替换fprintf并放置一个fputs(“TEST”,文件);
我如何能够像字符串一样快地输出双倍。我需要先将其转换为字符串吗?
我发现了一些转换。但如果我使用它们,我就像使用fprintf一样慢。
那么我怎么能把双重文件放到一个文件中,就好像我把一个字符串放到文件中一样?
fputs("TEST",fileout); //FAST
fprintf(fileout, "%f",p); //SLOW
编辑:
与fprintf双倍的时间:
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);
时间之间的变化只是我把双倍而不是TEST字符串放在文件中的变化。
答案 0 :(得分:4)
将浮点数转换为十进制表示是一种从根本上来说很慢的操作。您可以尝试使用%a
说明符而不是%f
将其存储为十六进制浮点数;这应该更快,并且可以安全地保留原始值而不是差的近似值。如果你需要小数,你应该使用%.21g
或类似的,而不是%f
,因为后者将失去大部分精度。
如果这对你来说都不够快,那么你可能需要直接保存值的二进制表示。