[Mew-dist 14760] Re: pick patternのキー head

KOIE Hidetaka ( 鯉江英隆 ) hide at example.com
2000年 10月 26日 (木) 02:54:05 JST


From: Takahiro Kambe <taca at example.com>
Subject: [Mew-dist 14759] Re: pick patternのキー head
Date: Thu, 26 Oct 2000 00:57:39 +0900

  | キャッシュというのもあるかもしれませんが、本質的にファイルのopen(2)っ
  | ていいう処理自体が単純にread(2)を繰り返すのに比べれば、はるかに重い処
  | 理だと思うんですが、どうでしょう?

たしかにopenは重いにちがいありません。

inodeもデータもキャッシュに載ってしまっている場合には
readに対するopenの重さが見えましたが、
どちらもキャッシュにまったく載ってない場合には
以下のような結果となりました。

    ファイル数: 9271
    総バイト数: 29262564B (約28MB)
総readバイト数: 28841386B (約27.5MB)

                     real  user  system
    --------------- -----  ----  ------
    openだけ         2.33  0.02   1.68
    open+read(16KB) 19.91  0.06   4.39    [単位は秒]

[環境]
           H/W: PentiumMMX 233MHz, memory 96MB
           HDD: IBM-DARA-212000, LBA, DMA, 32-bit, multi-block-16
            OS: FreeBSD-3.3 (with PAO)
   file system: FFS -o noatime
       compile: gcc -O3 foo.c -o foo           (openだけ版)
                gcc -DREAD -O3 foo.c -o foo2   (open+read版)

--
KOIE Hidetaka 鯉江英隆 <hide at example.com>
-------------- next part --------------
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>
#include <fcntl.h>
main()
{
    DIR* dirp;
    struct dirent *dp;
    int fd;
    int n = 0;
    char buf[16*1024];
    if (chdir("/usr/home/koie/Mail/unread/mew-dist") < 0) {
        perror("chdir");
        goto out;
    }
    if ((dirp = opendir(".")) == NULL) {
        perror("opendir");
        goto out;
    }
    while ((dp = readdir(dirp)) != NULL) {
        if (dp->d_name[0] != '.') {
            int m;
            if ((fd = open(dp->d_name, O_RDONLY)) < 0) {
                perror("open");
                goto out;
            }
#ifdef READ
            if ((m = read(fd, buf, sizeof buf)) < 0) {
                perror("read");
                goto out;
            }
#endif
            close(fd);
            n++;
        }
    }
    closedir(dirp);
    printf("%d\n", n);
 out:
    exit(0);
}



Mew-dist メーリングリストの案内