fputs vs. fprintf и double
Мне нужно выложить двойное значение в файл. Таким образом, для всей моей другой строки, которую я должен выложить, я использую fputs, потому что я думаю и рассчитал, что fputs быстрее, чем fprintf.
Но если я хочу вывести двойное значение, я не могу сделать это с помощью fputs, поэтому я попробовал fprintf. Это очень медленно. Мне нужно больше времени, если я заменю fprintf и положу туда fputs("TEST",file);
Как я могу потушить двойник так быстро, как струна. Нужно ли мне сначала преобразовать его в строку?
Я нашел какое-то преобразование. Но если я использую их, я так медленно, как если бы я использовал fprintf.
Так, как я могу выпустить двойной в файл так быстро, как если бы я выпустил строку в файл?
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);
Изменения между временем - это только то изменение, которое я поместил в файл вместо строки TEST.
1 ответ
Преобразование числа с плавающей запятой в десятичное представление является принципиально медленной операцией. Вы можете попробовать использовать %a
спецификатор вместо %f
хранить его как шестнадцатеричный код; это должно быть намного быстрее и безопасно сохранить исходное значение, а не плохое приближение. Если вам нужно десятичное число, вы должны использовать %.21g
или похожий, не %f
, так как последний потеряет большую часть точности.
Если ничего из этого не достаточно быстро для вас, то вам, вероятно, нужно сохранить двоичное представление значения напрямую.