文書を読むための一般的な方法と比較
7288 ワード
,
24M 。
C言語、フリーロード#include <stdio.h>
int main () {
char c[1];
int num;
FILE* fp = fopen("http://www.cnblogs.com/big.log", "rb");
while(1) {
num = fread(c, 1, 1, fp); // char, 1 1 byte, 1 1
//printf("%c",c[0]);
if (num == 0)
break;
}
return 0;
}
real m 1.399 s user m 1.028 s sys m 0.366 schar c[1024]に変更します。つまり1024個のbytesを一組として読んで、1グループを読んで、fread呼び出し回数を減らします。
num=fread(c,1024,1,fp)
real 0 m 0.041 s user 0 m 0.004 s sys 0 m 0.036 s
なお、戻り値は、読み終わったバイト数ではなく、成功したグループ数である。
ファイルのバイト数が1024未満の場合、上のfreadは0に戻ります。
huffmanプログラムの要求によって、byteグループであり、一度に複数のグループを読むべきです。
fread(c,1,1024,fp)のように戻り値は、読み出したバイト数に相当する。
NAME
fread、fwrite-binary stream input/out put
SYNOPSIS
#include
size_t fread(void*ptr、size size、size nmemb、FILE*stream);
size_t fwrite(const void*ptr、size size、size nmemb、
FILE*stream);
The 機能 fread() reads nmemb elements of data,each size bytes
long、from the stream pointed to by stream、storing them at the loca-
tion given by ptr.
python,read()
file = open('http://www.cnblogs.com/big.log', 'rb')
while 1:
c = file.read(1)
if c =='':
break
#print c,
ランタイムreal m 15.013 s user m 13.505 s
Pythonは関数の呼び出しに時間がかかりすぎる。
C++istreamuf_iterator
#include <iostream>
#include <iterator>
#include <string>
#include <fstream>
using namespace std;
int main () {
ifstream input_file("http://www.cnblogs.com/big.log",ios::binary);
char c;
//---istreambuf_iterator read,will read directly from the input stream
istreambuf_iterator<char> eos; // end-of-range iterator
istreambuf_iterator<char> iit (input_file);
while (iit!=eos) c =*iit++;
return 0;
}
real m 3.414 s user m 2.58 s sys 0 m 0.884 sC++istream_iterator
#include <iostream>
#include <iterator>
#include <string>
#include <fstream>
//Show C++ read a file by bytes
//Show C read a file by bytes
//Show system c read
//==================================================================
using namespace std;
int main () {
ifstream input_file("http://www.cnblogs.com/big.log",ios::binary);
input_file.unsetf(ios::skipws); //
char c;
//---istreambuf_iterator read,will read directly from the input stream
istream_iterator<char> eos; // end-of-range iterator
istream_iterator<char> iit (input_file);
while (iit!=eos) {
c =*iit++;
//cout << c;
}
return 0;
}
real m 2.433 s user m 1.732 s sys 0 m 0.704 s以上がgcc 4.2.4の結果です。変にeffective stl 29条によると、istream(u)を使います。iteratorはoperatorを使ってistreambouf_iteratorは直接流速区から読みますので、istreambouf_iteratorはとても速いです。
でも、実験の結果はかえって遅くなりました。
文書の読み書きのスピードを強調するなら、そのままCを使いましょう。
//C++cin.get(ch)、戻り値はアプリケーションのistreamオブジェクトです。
int main () {
ifstream input_file("http://www.cnblogs.com/big.log",ios::binary);
char c[1024];
//input_file.get(c,1024);
while(input_file.get(c[0]));
//cout << c[0];
return 0;
}
real m 2.300 s user 0 m 0.472 s sys m 1.700 s//C++cin.get(),-1はEOF終了を表します。
while((c[0] = input_file.get()) != EOF)
cout << c[0];
real 0 m 0.885 s user 0 m 0.244 s sys 0 m 0.360 s//get(char*、stremsize、delemeter=')を使うときは、2バイトを読むと2バイト目は\0、input_file.gcountは1を表示します。
この関数で一度に1文字を読むには、1ではなく2文字を使います。
input_file.get(c,2, EOF);
//System C read()
#include <fcntl.h>
int main () {
//char buf[2048];
char c[1024];
int num;
std::string s = "http://www.cnblogs.com/big.log";
//std::string s = "http://www.cnblogs.com/test.log";
//FILE* fp = fopen(s.c_str(), "rb");
int fp = open(s.c_str(), O_RDONLY);
while(1) {
//num = fread(c, 1024, 1, fp);
num = read(fp, c, 1);
//printf("%c",c[0]);
if (num == 0)
//if (c[0] == EOF)
break;
}
return 0;
real 0 m 43.560 s user m 4.908 s sys m 38.594 s