質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

6433閲覧

read/write fread/fwrite の計測方法

chiko.unagi

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/05/10 10:29

編集2020/05/10 12:49

readとfread 、writeとfwriteのファイル入出力を計測し、それぞれの性能の比較をしたいのですが、まるっきり実装方法がわからないです。

どうやって実行していけばいいのでしょうか。
ちなみに以下のコードをサンプルとして拡張させていくとのことでした。

C

1 #include <stdio.h> 2 #include <unistd.h> 3 #include <time.h> 4 5 double get_current_timecount() { 6 struct timespec ts; 7 clock_gettime(CLOCK_MONOTONIC, &ts); 8 return ts.tv_sec + ts.tv_nsec*1e-9; 9 } 10 11 int main( int argc, char* argv[] ) { 12 double t1 = get_current_timecount(); 13 14 // do something 15 sleep(3); 16 17 double t2 = get_current_timecount(); 18 printf("%lf\n", t2-t1); 19 return 0; 20 }

fread/fwrite

1#include "../exp1.h" 2 3int main(int argc, char** argv) { 4 FILE* fpr; 5 FILE* fpw; 6 int ret; 7 char buf[4]; 8 9 if(argc != 2) { 10 printf("usage: %s [filename]\n", argv[0]); 11 exit(-1); 12 } 13 14 fpr = fopen(argv[1], "r"); 15 fpw = fopen("tmp.txt", "w"); 16 17 ret = fread(buf, sizeof(char), 4, fpr); 18 while (ret > 0) { 19 fwrite(buf, sizeof(char), ret, fpw); 20 ret = fread(buf, sizeof(char), 4, fpr); 21 } 22 fclose(fpr); 23 fclose(fpw); 24 25 return 0; 26} 27

###試したこと

main.c

1 #include <stdio.h> 2 #include <unistd.h> 3 #include <time.h> 4 #include "exp1.h" 5 6 double get_current_timecount() { 7 struct timespec ts; 8 clock_gettime(CLOCK_MONOTONIC, &ts); 9 return ts.tv_sec + ts.tv_nsec*1e-9; 10 } 11 12 int main( int argc, char* argv[] ) { 13 FILE* fpr; 14 FILE* fpw; 15 int ret; 16 char buf[4]; 17 double t1 = get_current_timecount(); 18 19// 追加 20 if(argc != 2) { 21 printf("usage: %s [filename]\n", argv[0]); 22 exit(-1); 23 } 24 25 fpr = fopen(argv[1], "r"); 26 fpw = fopen("tmp.txt", "w"); 27 28 ret = fread(buf, sizeof(char), 4, fpr); 29 while (ret > 0) { 30 fwrite(buf, sizeof(char), ret, fpw); 31 ret = fread(buf, sizeof(char), 4, fpr); 32 } 33 fclose(fpr); 34 fclose(fpw); 35 36 //ここまで 37 double t2 = get_current_timecount(); 38 printf("%lf\n", t2-t1); 39 return 0; 40 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/05/10 10:43

それのなにを計測するというはなしかな?
episteme

2020/05/10 11:09 編集

え? 肝心のトコが欠落してんだけど。 readとfread 、writeとfwriteの入出力の「何」を計測し、比較する  んですか?
episteme

2020/05/10 11:08

あとコレ、本当にC++の課題ですか?
chiko.unagi

2020/05/10 11:27

すいません編集しておきました。ファイル入出力の性能比較ということでした。
episteme

2020/05/10 11:31 編集

>readとfread 、writeとfwriteのファイル入出力を計測し、それぞれの性能の比較をしたいのですが ファイル入出力の「何」の性能を比較するんですか?
chiko.unagi

2020/05/10 11:49

処理速度の比較です。あとすいませんC言語です
episteme

2020/05/10 11:51

だったら do something ってとこに、たとえば 1000回 read/fread するコード書けばよくて。 正直何がわからんのかわからんです。
guest

回答4

0

fread/fwriteとread/writeの違いはバッファリング(メモリ処理)です。
バッファリングをすることでメモリ上に蓄積したデータを一気に書き出したり、メモリに一度にデータを読み込んだりして、fread/fwriteの呼び出し回数より実際の読み書きの回数を削減できます。
数KBでも違いは確認できますが、1MB程度ならその差がよくわかると思います。

fread/fwriteのコード例をそのまま関数化して、do somethingのところで呼び出すようにすると実装が簡単です。(←既出でした。)

C

1#include <stdio.h> 2#include <stdlib.h> 3//#include <unistd.h> // for read/write function 4//#include <fcntl.h> // for read/write function 5#include <time.h> 6 7int fread_fwrite(int argc, char** argv) { 8 FILE* fpr; 9 FILE* fpw; 10 int ret; 11 char buf[4]; 12 13 if(argc != 2) { 14 printf("usage: %s [filename]\n", argv[0]); 15 exit(-1); 16 } 17 18 fpr = fopen(argv[1], "r"); 19 fpw = fopen("tmp.txt", "w"); 20 21 ret = fread(buf, sizeof(char), 4, fpr); 22 while (ret > 0) { 23 fwrite(buf, sizeof(char), ret, fpw); 24 ret = fread(buf, sizeof(char), 4, fpr); 25 } 26 fclose(fpr); 27 fclose(fpw); 28 29 return 0; 30} 31 32double get_current_timecount() { 33 struct timespec ts; 34 clock_gettime(CLOCK_MONOTONIC, &ts); 35 return ts.tv_sec + ts.tv_nsec*1e-9; 36} 37 38int main( int argc, char* argv[] ) { 39 double t1 = get_current_timecount(); 40 41 // do something 42 fread_fwrite(argc, argv); 43 44 double t2 = get_current_timecount(); 45 printf("%lf\n", t2-t1); 46 return 0; 47}

投稿2020/05/10 13:05

編集2020/05/10 13:07
etsuhisa

総合スコア416

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

https://www.cc.u-tokyo.ac.jp/public/VOL8/No5/data_no1_0609.pdf

setvbuf で、バッファリングサイズを変えてみましょう。

投稿2020/05/10 11:55

PingHermit

総合スコア478

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

この課題の前に、read、write、fread、fwriteを使用したプログラムの課題や演習はなかったでしょうか?

基本的には、今回の課題の「sleep(3);」の個所をそれらの処理に置き換えて実行することでそれぞれの処理時間を計測できるはずです。
(read、write、fread、fwriteの各1つで4種類作成すると思われます。)

投稿2020/05/10 11:07

etsuhisa

総合スコア416

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chiko.unagi

2020/05/10 11:30

それぞれのソースコードありました!試してみます!
etsuhisa

2020/05/10 12:02

以前の課題がreadとfread 、writeとfwriteのそれぞれで同じファイルから同じサイズのデータを読み書きするプログラムならよいのですが... 異なるファイルや異なるサイズのデータを扱うプログラムの場合には、readのプログラムをベースにfreadに書き換える(もしくはその逆)、writeのプログラムをベースにfwriteに書き換える(もしくはその逆)、といった実装が必要となるかもしれません。
chiko.unagi

2020/05/10 12:23

バッファサイズを変更しながら行っても同じような値が返されてしまうのですが、do something内にそのまま処理を移すだけではできませんか?
chiko.unagi

2020/05/10 12:27

fread/fwriteのコードを乗せておきました。
guest

0

ベストアンサー

これで分からないと言う事は、「ファイルを読み書きするというのはどういうことか」が分かっていないということなので、まずは、そこまで戻って復習しましょう。

復習が終われば、自然に分かります。

一歩ずつ理解を積み重ねないと、無駄な時間を使うことになります。

投稿2020/05/10 10:48

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chiko.unagi

2020/05/10 12:24

ファイル入出力は理解できましたが、計測のためのコードの書き方がいまいちわかりません。
otn

2020/05/10 12:37 編集

計測のためのコードは、サンプルコードに書かれているので、あなたは何も考える必要は無いです。 sleep(3);のところを時間を計測したいコードに置き換えるだけです。 時間を計測する部分を関数にして、その関数を呼ぶように書けばいいかと思います。
chiko.unagi

2020/05/10 12:50

試しにコードを変更してやってみました。新しいコードはのせてあります。 しかしけいそくしたところバッファの数を変えても0.0023,0.0024などほぼ値に変化がないのですが、コードが違っていますか?それともバッファの変更しているところが違うのでしょうか。
otn

2020/05/10 13:10 編集

プログラムはよく書けています。 「まるっきり」とお書きだったので、最初、もっと書けない人かと思っていて、失礼しました。 char buf[4];をchar buf[4000];に変えても時間が変わらないという事なら、テストするファイルが小さすぎます。あと、readの引数も変えないとですね。 例えば、4バイトと4000バイトの比較であれば、数百キロバイトできればメガバイト単位のファイルが必要でしょう。 200キロバイトのファイルだと、0.015988 → 0.005988 と半分以下になりました。
otn

2020/05/10 13:14

fread(buf, 1, sizeof(buf), fpr); にすると、char but[ ]; の数字を変えるだけでバッファサイズが変わります。 正確には、fread(buf, sizeof(char), sizeof(buf)/sizeof(char), fpr); または、fread(buf, sizeof(buf[0]), sizeof(buf)/sizeof(buf[0]), fpr); ですが。
chiko.unagi

2020/05/10 14:15

テストするファイルの大きさを変えたらうまくいくようになりました!わざわざお時間いただいてしまって申し訳ありません。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問