Category Archives: 7-2. バイナリ処理

さてと、truncate本物と比較するか

マイtruncateが一応動くようになったので、本物truncateコマンドと処理時間比較していきます。
timeで計測します。

新規バイナリデータ生成。100000000サイズのオール0バイナリを生成します。
まずは、マイtruncateから。

takk@deb9:~/tmp$ time ./a.out -s100000000 a.bin

real	0m2.344s
user	0m0.564s
sys	0m0.020s
takk@deb9:~/tmp$

2秒以上かかりました。次は、本物のtruncate。

takk@deb9:~/tmp$ time truncate -s100000000 b.bin

real	0m0.005s
user	0m0.000s
sys	0m0.000s
takk@deb9:~/tmp$ cmp a.bin b.bin
takk@deb9:~/tmp$ wc -c *.bin
100000000 a.bin
100000000 b.bin
200000000 合計
takk@deb9:~/tmp$ 

速い。全然かないませんね。

次は、切り詰める方。両コマンド共に、システムコールを使ってるので時間はあまり変わらないハズ。
マイtruncate、truncateの順に使います。

takk@deb9:~/tmp$ time ./a.out -s1 a.bin

real	0m0.040s
user	0m0.000s
sys	0m0.008s
takk@deb9:~/tmp$ time truncate -s1 b.bin

real	0m0.026s
user	0m0.000s
sys	0m0.004s
takk@deb9:~/tmp$ cmp a.bin b.bin
takk@deb9:~/tmp$ wc -c *.bin
1 a.bin
1 b.bin
2 合計
takk@deb9:~/tmp$ 

予想通りあまり変わりませんでした。

忘れてました。setbufでバッファサイズ変えれば、fopen使っても早くなるかもしれない。

     1	#include <stdio.h>
     2	#include <stdlib.h>
     3	#include <sys/types.h>
     4	#include <sys/stat.h>
     5	#include <unistd.h>
     6	
     7	int main(int argc, char* argv[])
     8	{
     9		FILE *fp;
    10		int i,len,size=0;
    11		int value=0;
    12		int ch;
    13		struct stat buf;
    14		char *filename;
    15		char stream_buf[1024*1024];
    16		while ((ch = getopt(argc, argv, "s:v:")) != -1){



    35		for(; optind<argc; optind++){
    36			filename = argv[optind];
    37			if(stat(filename,&buf) != 0){
    38				fp = fopen(filename,"w");
    39				setvbuf(fp,stream_buf,_IOFBF,1024*1024);
    40				if(fp == NULL){

15,39行目に追加しました。早くなるでしょうか。

takk@deb9:~/tmp$ time ./a.out -s100000000 a.bin

real	0m2.471s
user	0m0.576s
sys	0m0.040s
takk@deb9:~/tmp$ 

変わりませんでした。使い方がそもそも違うのかもしれません。これもいつか調べてみます。
まあ、マイtruncateは遅いですが、-vオプションで自由に値が決められるメリットがあるので、使っていこうかと思います。