1

double 値をファイルに出力する必要があります。したがって、出力する必要がある他のすべての文字列については、fputs を使用します。これは、fputs が fprintf よりも高速であると考え、タイミングを合わせたためです。

しかし、double 値を出力したい場合、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 文字列の代わりに double を入れた変更のみです。

4

1 に答える 1

4

浮動小数点数を 10 進数表現に変換する操作は、基本的に時間がかかります。16 進浮動小数点数として格納する%a代わりに、指定子を使用してみてください。%fこれははるかに高速であり、不十分な近似ではなく元の値を安全に保持します。10 進数が必要な場合は、%.21gまたは同様のものを使用する必要があります%f。後者は精度のほとんどを失うためです。

これで十分な速度が得られない場合は、おそらく値のバイナリ表現を直接保存する必要があります。

于 2013-04-25T15:22:53.347 に答える