fputs против 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.


person bladepit    schedule 25.04.2013    source источник
comment
Должен ли файл быть удобочитаемым для человека?   -  person K Scott Piel    schedule 25.04.2013
comment
1. Это текстовый или бинарный файл? 2. %f вместо float, %lf вместо double.   -  person Crozin    schedule 25.04.2013
comment
@Crozin: Нет, и %f, и %lf предназначены для двойного числа. Невозможно передать float в fprintf.   -  person R.. GitHub STOP HELPING ICE    schedule 25.04.2013
comment
Как вы измеряете скорость?   -  person R.. GitHub STOP HELPING ICE    schedule 25.04.2013
comment
@R..: Конечно, вы правы - моя ошибка.   -  person Crozin    schedule 25.04.2013
comment
Измерение скорости с помощью печати даты до и после записи в файл... очень просто   -  person bladepit    schedule 25.04.2013
comment
отредактировал мой вопрос с примером и тем, как я измеряю скорость   -  person bladepit    schedule 26.04.2013


Ответы (1)


Преобразование числа с плавающей запятой в десятичное представление — очень медленная операция. Вы можете попробовать использовать спецификатор %a вместо %f, чтобы сохранить его как шестнадцатеричное число с плавающей запятой; это должно быть намного быстрее и безопасно сохранит исходное значение, а не плохое приближение. Если вам нужно десятичное число, вы должны использовать %.21g или подобное, а не %f, так как последнее потеряет большую часть точности.

Если ничего из этого для вас недостаточно быстро, то вам, вероятно, нужно напрямую сохранить двоичное представление значения.

person R.. GitHub STOP HELPING ICE    schedule 25.04.2013
comment
двоичное представление - очень хорошая идея, но файл должен быть загружен другой программой, поэтому он должен быть в этом формате... я попробую ваши форматы - person bladepit; 25.04.2013