--Boundary-00=_ERJWATJS10defq4 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Hello, while I was already at it ... see the attached patches. This gives me another improvement 18,5s->15s (that's after the 22,5->18,5 improvement I just mentioned in the ld.so madvise post, same machine, same plain KDE session). Looks like I was pretty naive to think the system would be actually good at quickly loading things from the HDD :(. The xdm patch is for SUSE's /etc/init.d/xdm , the paths in it are hardcoded for the moment ($KDEDIR is /opt/_k, $KDEHOME /home/kde2/.k, $QTDIR /opt/_q). This should be better tested right after reboot, because it seems to be that the OOM way of clearing the caches doesn't work that well for inodes. The questions, of course, are now: - can anybody confirm (and give numbers)? - which directories should be prescanned. In my case the prescanning took 11,5s , which is noticeably more than the 3s gain. After being more picky about $KDEDIR/share and scanning only some of its subdirectories, the time of course went down, but so did the gain. I was thinking along the lines that there could be a list of directories to scan, most important first, and the scanning would go in background until the user actually starts startkde. See the next point. I actually also tried to do just 'scan /', and but it looks like there's not much to gain by scanning more. The rest of the difference compared to the completely (logout->login) cached case seem to be actual loading of files, which is very likely to be too much to be able to do it. - where to do this caching. KDM (hello Ossi) and init.d script seem the two places where this could be done, it takes some time to log in using kdm, and there are definitely placed during init.d startup when the HDD must be pretty bored. Ossi, could you please provide some thoughts on this? I don't know how that works, and there could be two places where to have this caching running, while typing in kdm, and also while initializing X (at least it seem to be that while initializing the graphics mode or whatever it's just waiting for about two seconds and nothing is really happening). -- Lubos Lunak KDE developer --------------------------------------------------------------------- SuSE CR, s.r.o. e-mail: l.lunak@suse.cz , l.lunak@kde.org Drahobejlova 27 tel: +420 2 9654 2373 190 00 Praha 9 fax: +420 2 9654 2374 Czech Republic http://www.suse.cz/ --Boundary-00=_ERJWATJS10defq4 Content-Type: text/x-diff; charset="us-ascii"; name="xdm.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xdm.patch" --- xdm.sav 2004-03-17 18:10:54.000000000 +0100 +++ xdm 2004-03-17 18:09:32.000000000 +0100 @@ -63,6 +63,10 @@ DM=${DISPLAYMANAGER##*/} rc_reset case "$1" in start) + /tmp/scan /opt/_k/share \ + /home/kde2/.k /opt/_k/lib \ + /opt/_q/lib /opt/_q/plugins \ + -/lib -/usr/lib & echo -n "Starting service $DM" startproc $PIDFILE $DISPLAYMANAGER || rc_failed # After a crash or a kill signal we may have --Boundary-00=_ERJWATJS10defq4 Content-Type: text/x-c++src; charset="us-ascii"; name="scan.cpp" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="scan.cpp" #include #include #include #include #include #include void scan( const char* dirname, bool recurse ) { if( chdir( dirname ) < 0 ) return; // if( strcmp( dirname, "/dev" ) == 0 ) // return; // if( strcmp( dirname, "/proc" ) == 0 ) // return; // static int cnt = 0; // if( ++cnt % 1000 == 0 ) // fprintf( stderr, "D:%s\n", dirname ); if( DIR* dir = opendir( "." )) { while( dirent* file = readdir( dir )) { struct stat data; if( stat( file->d_name, &data ) < 0 ) continue; // fprintf( stderr, "F:%s\n", file->d_name ); if( strcmp( file->d_name, "." ) == 0 || strcmp( file->d_name, ".." ) == 0 ) continue; if( recurse && S_ISDIR( data.st_mode )) { // fprintf( stderr, "I:%s\n", file->d_name ); char tmp[ NAME_MAX * 2 + 1 ]; strcpy( tmp, dirname ); // if( strcmp( tmp, "/" ) != 0 ) // strcat( tmp, "/" ); strcat( tmp, file->d_name ); scan( tmp, recurse ); chdir( dirname ); } } closedir( dir ); } } int main( int argc, char* argv[] ) { for( int i = 1; i < argc; ++i ) { if( argv[ i ][ 0 ] == '-' ) scan( argv[ i ] + 1, false ); else scan( argv[ i ], true ); } return 0; } --Boundary-00=_ERJWATJS10defq4 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Kde-optimize mailing list Kde-optimize@kde.org https://mail.kde.org/mailman/listinfo/kde-optimize --Boundary-00=_ERJWATJS10defq4--