[Yaffs] heavy file usage in yaffs
Jacob Dall
jacob.dall@operamail.com
Sun, 23 Jan 2005 20:59:37 +0100
Hello Charles,
I accept your priority, but this slow dirlist issue is very important to me=
. I really need a way faster method of giving me the name of the files in a=
folder.
I've come up with a solution - so far, it works for me when listing the roo=
t folder containing files only (no symlinks, hardlinks or folders). But I'm=
not sure whether or not it'll generally work no matter the layout of files=
and folders.
<code>
char *yaffs_Dir (const char *path) {
char *rest;
yaffs_Device *dev =3D NULL;
yaffs_Object *obj;
yaffs_Object *entry =3D NULL;
struct list_head *i;
char name[1000], str[1000], info[1000];
char *names =3D (char*)malloc(15*10000);
int nOk =3D 0, nNull =3D 0;
int len =3D strlen(path);
struct yaffs_stat s;
memset(names, 0, 15*10000);
obj =3D yaffsfs_FindRoot(path,&rest);
if (obj && obj->variantType =3D=3D YAFFS_OBJECT_TYPE_DIRECTORY) {
list_for_each(i,&obj->variant.directoryVariant.children) {
entry =3D (i) ? list_entry(i, yaffs_Object,siblings) : NULL;
if (entry) {
yaffs_GetObjectName(entry,name,YNAME_MAX+1);
sprintf(str, "%s/%s", path, name);
yaffs_lstat(str,&s);
sprintf(info, "%s length %ld mode %x\n",name,s.st_size,s.st_mode);
strcat(names, info);
nOk++;
} else {
nNull++;
}
}
}
printf("nOk=3D%d, nNull=3D%d\n",nOk,nNull);
return names;
}
</code>
In my system, this function takes approx. 10 secs to complete - that's amaz=
ing 60 times faster than if using the 'opendir/readdir' implemented in yaff=
s.
Comments are very welcome.
Thanks,
Jacob
----- Original Message -----
From: "Charles Manning" <manningc2@actrix.gen.nz>
To: "Jacob Dall" <jacob.dall@operamail.com>, "Charles Manning" <Charles.Man=
ning@trimble.co.nz>, yaffs@stoneboat.aleph1.co.uk
Subject: Re: [Yaffs] heavy file usage in yaffs
Date: Tue, 18 Jan 2005 15:20:57 +1300
>=20
> On Tuesday 18 January 2005 04:00, Jacob Dall wrote:
> > Hello Charles,
> >
> > All file names are on a 8.3 format, and NO, I'm not using
> > SHORT_NAMES_IN_RAM.
> >
> > I've just recompiled my project defining CONFIG_YAFFS_SHORT_NAMES_IN_RA=
M,
> > but unfortunately I notice no change in time used to perform the dumpDi=
r().
> >
> > The files I'm listing, was written before I defined short names in RAM.=
In
> > this case, should one expect the operation to take less time?
> >
> > The CPU I'm running this test on, is comparable to a Pentium I-200MHz.
>=20
>=20
> NB This only applies to yaffs_direct, not to Linux.
>=20
> I did some tests using yaffs direct as a user application on a ram emulat=
ion
> under Linux.
>=20
> This too showed slowing. I did some profiling with gprof which pretty qui=
ckly
> pointed to the problem...
>=20
> The way yaffs does the directory searching is to create a linked list of
> items found so far in the DIR handle. When it does a read_dir, it has to =
walk
> the list of children in the directory and check if the entry in in the li=
st
> of items found so far. This makes the look up time increase proportional =
to
> the square of the number of items found (O(n^2)) so far ( ie. each time it
> looks at more directory entries as well as compare them to a longer "alre=
ady
> found" list).
>=20
> The current implementation could be sped up somewhat by using a balanced
> binary tree for the "found list". This would reduce the time to O(n log n=
). I
> could be motivated to do something about this but it is not a current
> priority for me.
>=20
> The other approach is the weasle approach. Don't use such large directori=
es.
> but rather structure your directory tree to use smaller sub-directories.
>=20
> -- Charles
>=20
>=20
>=20
> _______________________________________________
> yaffs mailing list
> yaffs@stoneboat.aleph1.co.uk
> http://stoneboat.aleph1.co.uk/cgi-bin/mailman/listinfo/yaffs