マイ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オプションで自由に値が決められるメリットがあるので、使っていこうかと思います。
コメント