On Fri, Sep 27, 2013 at 01:51:51AM +0200, JR wrote:
> On Thursday, 26 September 2013 at 23:04:22 UTC, bearophile wrote:
> >I am not sure how a IRC bot could consume more than a tiny
> >fraction of the CPU time of a modern multi-GHz processor.
> 
> Nor does it bite into my 8 gigabytes of ram.
> 
> Forgive me, but the main culprit in all of this is still me doing it
> wrong. Can I keep the same RegexMatcher (perhaps as a struct member)
> and reuse it between matchings?

Not sure what you mean, but are you compiling regexes every time you use
them? If so, you should be storing them instead, for example:

        // Place to store precompiled regex matchers.
        struct MyContext {
                Regex!char pattern1;
                Regex!char pattern2;
                Regex!char pattern3;
                ...
        }

        // Presumably, this will run far more frequently than
        // updatePatterns. 
        auto runMatches(MyContext ctxt, string message) {
                if (message.match(ctxt.pattern1)) {
                        ...
                } else if (message.match(ctxt.pattern2)) {
                        ...
                }
                ...
        }

        // Presumably, this only runs once in a while, so you save on
        // the cost of compiling/storing the regex every single time you
        // run a match.
        void updatePatterns(ref MyContext ctxt,
                string newPattern1,
                string newPattern2,
                string newPattern3, ...)
        {
                ctxt.pattern1 = regex(newPattern1);
                ctxt.pattern2 = regex(newPattern2);
                ctxt.pattern3 = regex(newPattern3);
                ...
        }

So when you need to update your regexes, say based on reloading a config
file or something, you'd run updatePatterns() to compile all the
patterns, then runMatches() can be used during the normal course of your
program. This should save on a lot of overhead.

Of course, if you have regexes that are fixed at compile-time, you could
use ctRegex to *really* speed things up. Or, if that makes your
compilation too slow (it does have a tendency of doing that), initialize
your patterns in a static this() block:

        Regex!char predeterminedPattern1;
        Regex!char predeterminedPattern2;
        static this() {
                predeterminedPattern1 = regex(`...`);
                predeterminedPattern2 = regex(`...`);
        }
        ...
        void matchStuff(string message) {
                if (message.match(preterminedPattern1)) {
                        ...
                }
                ...
        }


> >And I am not sure if regular expressions are a good idea to
> >implement a IRC interface.
> 
> I dare say I disagree!

Yeah, anything involving heavy string processing is probably best done
using regexes rather than ad hoc string slicing, which is bug-prone and
hard to maintain.


T

-- 
First Rule of History: History doesn't repeat itself -- historians merely 
repeat each other.

Reply via email to