svn commit: r246134 - head/sbin/devd

2013-01-30 Thread Ian Lepore
Author: ian
Date: Wed Jan 30 23:37:35 2013
New Revision: 246134
URL: http://svnweb.freebsd.org/changeset/base/246134

Log:
  Improve devd startup time, by tweaking some string handling routines that are
  heavily used when parsing config files.  Mostly these changes avoid making
  temporary copies of the strings, and avoid doing byte at a time append
  operations, on the most-used code path.
  
  On a 1.2 GHz ARM processor this reduces the time to parse the config files
  from 13 to 6 seconds.
  
  Reviewed by:  imp
  Approved by:  cognet (mentor)

Modified:
  head/sbin/devd/devd.cc
  head/sbin/devd/devd.hh

Modified: head/sbin/devd/devd.cc
==
--- head/sbin/devd/devd.cc  Wed Jan 30 23:20:28 2013(r246133)
+++ head/sbin/devd/devd.cc  Wed Jan 30 23:37:35 2013(r246134)
@@ -137,7 +137,7 @@ config cfg;
 
 event_proc::event_proc() : _prio(-1)
 {
-   // nothing
+   _epsvec.reserve(4);
 }
 
 event_proc::~event_proc()
@@ -241,25 +241,18 @@ my_system(const char *command)
 bool
 action::do_action(config c)
 {
-   string s = c.expand_string(_cmd);
+   string s = c.expand_string(_cmd.c_str());
if (Dflag)
fprintf(stderr, Executing '%s'\n, s.c_str());
my_system(s.c_str());
return (true);
 }
 
-match::match(config c, const char *var, const char *re)
-   : _var(var), _re(^)
+match::match(config c, const char *var, const char *re) :
+   _inv(re[0] == '!'),
+   _var(var),
+   _re(c.expand_string(_inv ? re + 1 : re, ^, $))
 {
-   if (!c.expand_string(string(re)).empty() 
-   c.expand_string(string(re)).at(0) == '!') {
-   _re.append(c.expand_string(string(re)).substr(1));
-   _inv = 1;
-   } else {
-   _re.append(c.expand_string(string(re)));
-   _inv = 0;
-   }
-   _re.append($);
regcomp(_regex, _re.c_str(), REG_EXTENDED | REG_NOSUB | REG_ICASE);
 }
 
@@ -624,24 +617,37 @@ config::expand_one(const char *src, str
do {
buffer.append(src++, 1);
} while (is_id_char(*src));
-   buffer.append(, 1);
dst.append(get_variable(buffer.c_str()));
 }
 
 const string
-config::expand_string(const string s)
+config::expand_string(const char *src, const char *prepend, const char *append)
 {
-   const char *src;
+   const char *var_at;
string dst;
 
-   src = s.c_str();
-   while (*src) {
-   if (*src == '$')
-   expand_one(src, dst);
-   else
-   dst.append(src++, 1);
+   /*
+* 128 bytes is enough for 2427 of 2438 expansions that happen
+* while parsing config files, as tested on 2013-01-30.
+*/
+   dst.reserve(128);
+
+   if (prepend != NULL)
+   dst = prepend;
+
+   for (;;) {
+   var_at = strchr(src, '$');
+   if (var_at == NULL) {
+   dst.append(src);
+   break;
+   }
+   dst.append(src, var_at - src);
+   src = var_at;
+   expand_one(src, dst);
}
-   dst.append(, 1);
+
+   if (append != NULL)
+   dst.append(append);
 
return (dst);
 }

Modified: head/sbin/devd/devd.hh
==
--- head/sbin/devd/devd.hh  Wed Jan 30 23:20:28 2013(r246133)
+++ head/sbin/devd/devd.hh  Wed Jan 30 23:37:35 2013(r246134)
@@ -90,9 +90,9 @@ public:
virtual bool do_match(config );
virtual bool do_action(config ) { return true; }
 private:
+   bool _inv;
std::string _var;
std::string _re;
-   bool _inv;
regex_t _regex;
 };
 
@@ -162,7 +162,8 @@ public:
void pop_var_table();
void set_variable(const char *var, const char *val);
const std::string get_variable(const std::string var);
-   const std::string expand_string(const std::string var);
+   const std::string expand_string(const char * var, 
+   const char * prepend = NULL, const char * append = NULL);
char *set_vars(char *);
void find_and_execute(char);
 protected:
___
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to svn-src-all-unsubscr...@freebsd.org


Re: svn commit: r246134 - head/sbin/devd

2013-01-30 Thread Alexey Dokuchaev
On Wed, Jan 30, 2013 at 11:37:36PM +, Ian Lepore wrote:
 New Revision: 246134
 URL: http://svnweb.freebsd.org/changeset/base/246134
 
 Log:
   Improve devd startup time, by tweaking some string handling routines [...]
   
   On a 1.2 GHz ARM processor this reduces the time to parse the config files
   from 13 to 6 seconds.

Sweet!  MFCs are planned, I presume?

./danfe
___
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to svn-src-all-unsubscr...@freebsd.org


Re: svn commit: r246134 - head/sbin/devd

2013-01-30 Thread Ian Lepore
On Thu, 2013-01-31 at 01:26 +, Alexey Dokuchaev wrote:
 On Wed, Jan 30, 2013 at 11:37:36PM +, Ian Lepore wrote:
  New Revision: 246134
  URL: http://svnweb.freebsd.org/changeset/base/246134
  
  Log:
Improve devd startup time, by tweaking some string handling routines [...]

On a 1.2 GHz ARM processor this reduces the time to parse the config files
from 13 to 6 seconds.
 
 Sweet!  MFCs are planned, I presume?
 
 ./danfe

After it gets some test miles on it, yeah.  We can really use this on
our extra-wimpy ARM processors (180 MHz) at work.

-- Ian


___
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to svn-src-all-unsubscr...@freebsd.org