以下のプログラムのサイズを変えて消費時間を測定しました。
ユーザバッファを使用した場合としなかった場合では(特にサイズが小さい場合)消費時間に差が出たのですが何故でしょうか?
プログラムの高速化に対してのユーザバッファの役割を教えていただきたいです。
よろしくお願いします。
測定結果
W_BYTE(サイズ)___ユーザバッファ使用(秒)___ユーザバッファ使用なし(秒)
10_______________0:02.75_____________________2:54.40
100______________0:01.55_____________________0:18.75
1000_____________0:01.40_____________________0:03.11
10000____________0:01.27_____________________0:01.33
100000___________0:01.12_____________________0:01.13
1000000__________0:01.11_____________________0:01.11
3000000__________0:01.10_____________________0:01.10
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <unistd.h>
typedef unsigned char UCHAR;
#define DIM1 1000
#define DIM2 1000
#define DIM3 3
#define MAX_REPEAT 100 //出力繰り返し回数
void write_ppm_cip(UCHAR [][DIM2][DIM3],char *,int ,int );
UCHAR org[DIM1][DIM2][DIM3];
int main(void)
{
int i;
int dim1,dim2,dim3;
/***** 配列の初期化 *****/
for(dim1=0;dim1<DIM1;dim1++)
for(dim2=0;dim2<DIM2;dim2++)
for(dim3=0;dim3<DIM3;dim3++)
org[dim1][dim2][dim3]=(UCHAR)((dim1*200+dim2*dim2+dim3*dim3)%256);
for(i=0;i<MAX_REPEAT;i++)
{
write_ppm_cip(org,"/tmp/img.ppm",DIM1,DIM2);
// sleep(1); /* 一定時間待つ */
//system("/bin/sync"); /* ディスク上のデータをメモリと同期 */
}
return 0;
}
/* 一度に書き込むサイズ(バイト) */
//#define W_BYTE DIM1*DIM2*DIM3
#define W_BYTE 10
/* CIP形式の画像データよりPPMファイル作成 */
void write_ppm_cip(UCHAR data_buf[][DIM2][DIM3],char *fname,int
width,int height)
{
FILE *fp;
/* ファイルを開く */
if((fp = fopen(fname, "wb")) == NULL) {
fprintf(stderr, "file(%s) can't open\n", fname) ;
exit(1) ;
}
setvbuf(fp,NULL,_IONBF,0); /* ユーザバッファを使用しない場合,有効にする */
fprintf(fp, "P6\n") ; /* カラー画像かつバイナリーデータの記号 */
fprintf(fp, "%d %d\n", width, height) ; /* 画像の幅(列数)と高さ(行数) */
fprintf(fp, "255\n") ; /* 最大値 */
{ /* 画像データをrepeat(+1)個に分割して書き込み */
int i;
int repeat=(DIM1*DIM2*DIM3)/(W_BYTE); /* 分割数 */
int rest=DIM1*DIM2*DIM3-repeat*(W_BYTE); /* 余りデータ量 */
UCHAR *pt=(UCHAR *)&data_buf[0][0][0]; /* 書き込むデータの位置を持つポイ
ンタ */
for(i=0;i<repeat;i++)
{
fwrite(pt, sizeof(UCHAR), W_BYTE, fp);
pt += W_BYTE;
}
if(rest > 0)
fwrite(pt, sizeof(UCHAR), rest, fp);
}
fclose(fp); /* ファイルを閉じる.fflush()と同じ効果がある. */
}
No.1ベストアンサー
- 回答日時:
fwrite関数は、何も指定しないと一度バッファ(メモリ)に貯めて、バッファが一杯になったらファイルを書き出します。
これは、メモリに比べて低速なハードディスクにアクセスする回数を減らすためにバッファリングしているわけです。
アクセス回数が増えるとどういう問題があるかというと、ハードディスクにアクセスしている間、プログラムは低速な処理が終わるのを待たされることになります。例えばアクセスで10ms待たされるとすると、10バイトx100回で1000バイトを書き出した場合1秒かかります。
これが100バイトx10回だと0.1秒しか必要ありません。
ですので、setvbufでバッファを無効にするとfwriteの毎にファイルを書き出すので小さいサイズほど遅くなります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル出力で改行を入れたい!
-
C言語でファイル読み書きを早く...
-
c言語でのfscanfについて
-
C言語でセグメンテーションエ...
-
fscanfでループしてしまう。
-
fopenの追記モードについて
-
ファイルが読み込めない・・・
-
ファイルに行番号を追加
-
プログラム
-
icon format について
-
fgets( ) の返り値は何?
-
【C言語】ファイルを読み込んで...
-
テキストファイル内に対して, ...
-
複数ファイルの同時読み込みの...
-
エラーがわかりません、、
-
ファイルをオープンするときの...
-
ファイルへの書込み処理が異常...
-
初心者のc言語
-
バイナリファイルの読み込み(C...
-
fopenでファイル名に、変数を使...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ガンマ変換 C言語でプログラ...
-
c言語でのfscanfについて
-
なぜCSQとCIP形式ではコ...
-
複数ファイルの同時読み込みの...
-
fopenでファイル名に、変数を使...
-
ファイル出力で改行を入れたい!
-
ファイルへの書込み処理が異常...
-
【C言語】ファイルを読み込んで...
-
エラーがわかりません、、
-
C言語でセグメンテーションエ...
-
C言語でファイル読み書きを早く...
-
テキストファイル内に対して, ...
-
fgets( ) の返り値は何?
-
ファイルに行番号を追加
-
OpenGLによる描画内容をBMP出力
-
fscanfでループしてしまう。
-
c言語 ファイルから数字を読み...
-
ファイルが読み込めない・・・
-
CRC32の計算方法
-
CSVファイルの内容を構造体に格...
おすすめ情報