[(ansi) C] Regex.c traagheid! ;(

Pagina: 1
Acties:

  • _cyclops_
  • Registratie: Mei 2000
  • Laatst online: 07-03-2025
Hoi,

'k ben weer bezig in C onder linux, nu met wat regex code, opzich werkt dit prima e.d. alleen 'k moet het zo'n 25000 keer doen achter elkaar, het is deze functie die ik gemaakt heb:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int RegexMatch(char *string, char *pattern) {
  regex_t preg;
  int tmp;
  tmp = regcomp(&preg,pattern,REG_ICASE );
  if (tmp != 0) {
    return -1;
  }
  tmp = regexec(&preg,string,0,0,0);
  regfree(&preg);
  if (tmp == 0) {
    return 1; // match
  } else if (tmp == REG_NOMATCH) {
    return 0; // no match, no error.
  } else {
    return -1; // error.
  }
}

Prima code lijkt me (hehe)... 'k was eerst de regfree() vergeten, dat is lullig kan 'k je vertellen |:(

Maar, nu lijkt deze functie goed te werken.. echter, op 25000 keer duur 't zo'n 20 sec.
het is dus enorm traag, en ik wil dit 'snel' hebben.

Weet iemand hier een oplossing voor, het geeft niet als ik iets andere soort regex moet gaan gebruiken. Dit is posix regex.

Weet iemand een oplossing?

  • Grum
  • Registratie: Juni 2001
  • Niet online
Om watvoor regexes gaat et hier ? en op watvoor strings laat je ze los ?

  • _cyclops_
  • Registratie: Mei 2000
  • Laatst online: 07-03-2025
Hej Grum >:)

't gaat hier om nog vrij eenvoudige.
Vooral URL's
string="http://www.google.com/";
pattern=".*google.com.*";

als voorbeeld.
Het gaat hier om de POSIX regular expressions die bij libc zitten (geloof ik)... (man regex :)

  • Rukapul
  • Registratie: Februari 2000
  • Laatst online: 07:17
Verandert je pattern tussendoor?

Zoals ik het nu zie doe je telkens een hoop initialisatie en geef je dat daarna weer vrij. Is het niet mogelijk om 1x die init te doen en dan die 25.000 er doorheen te jassen.

Anders zul je zelf een finite state automaat moeten bouwen voor dit specifieke doel.

  • igmar
  • Registratie: April 2000
  • Laatst online: 16:13

igmar

ISO20022

'k ben weer bezig in C onder linux, nu met wat regex code, opzich werkt dit prima e.d. alleen 'k moet het zo'n 25000 keer doen achter elkaar, het is deze functie die ik gemaakt heb:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int RegexMatch(char *string, char *pattern) {
  regex_t preg;
  int tmp;
  tmp = regcomp(&preg,pattern,REG_ICASE );
  if (tmp != 0) {
    return -1;
  }
  tmp = regexec(&preg,string,0,0,0);
  regfree(&preg);
  if (tmp == 0) {
    return 1; // match
  } else if (tmp == REG_NOMATCH) {
    return 0; // no match, no error.
  } else {
    return -1; // error.
  }
}

Prima code lijkt me (hehe)... 'k was eerst de regfree() vergeten, dat is lullig kan 'k je vertellen |:(

Maar, nu lijkt deze functie goed te werken.. echter, op 25000 keer duur 't zo'n 20 sec.
het is dus enorm traag, en ik wil dit 'snel' hebben.
regcomp() moet je eenmalig uitvoeren, tenzij je een constant veranderend pattern hebt. In dat geval kun je een andere regexp lib nemen, maar daar zul je geen hele seconden mee winnen.

Het meeste werk zit in de regcomp*(), dit is een vrij gecompliceerde functie die behoorlijk veel overhead geeft. De kunst is dus te proberen om zo min mogelijk je pattern te veranderen.

Als alternatief kun je de pcre lib gebruiken, deze is vrij snel.

  • Grum
  • Registratie: Juni 2001
  • Niet online
Korte string, relatief simpele regex .. dat is de oorzaak dus niet :)

Ik denk/hoop dat een/de pcre lib wat sneller voor je is :)

  • _cyclops_
  • Registratie: Mei 2000
  • Laatst online: 07-03-2025
hmm
oke... nadeel is wel dat je die lib dan geinstalleerd moet hebben, maargoed...

'k ga dat dan proberen, dank!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11:02
Op woensdag 08 mei 2002 10:22 schreef _cyclops_ het volgende:
oke... nadeel is wel dat je die lib dan geinstalleerd moet hebben, maargoed...
Als dat echt een bezwaar is kun je 'm gewoon statisch linken natuurlijk. Daarbij lijkt het me redelijk zinloos om pcre's te gebruiken als je zoiets simpels doet als jij nu.

Gewoon de huidige code blijven gebruiken dus, maar dan op de goede manier.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
* Orphix heeft ergens nog een zelfgemaakt C++ versie van PCRE liggen, helaas dat de gebruiker linux gebruikt :P

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11:02
Op woensdag 08 mei 2002 19:40 schreef Orphix het volgende:
* Orphix heeft ergens nog een zelfgemaakt C++ versie van PCRE liggen, helaas dat de gebruiker linux gebruikt :P
Dat zal een aardige klus geweest zijn; PCRE's ondersteunen VEEL dingen!

Waarom zou een C++ versie onder Linux trouwens niet van pas kunnen komen?

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op woensdag 08 mei 2002 21:00 schreef Soultaker het volgende:
Dat zal een aardige klus geweest zijn; PCRE's ondersteunen VEEL dingen!
Hehe ja het was ook meer een wrapper om std::string's te ondersteunen :)
Zelf een (simpele) regexp bouwen is trouwens best aardig om een goede inzicht te krijgen in de interne werking. Helaas merkte ik dat het uitgebreidere Perl het sneller kon :( ;)
Waarom zou een C++ versie onder Linux trouwens niet van pas kunnen komen?
Nou het was meer een opmerking dat linux/unix programmeurs vaak teruggrijpen naar het 'oude' C, wat IMHO een verkeerde stap is. Ik zeg dit meestal puur om wat te stoken :)
Maar het zou best kunnen werken onder linux denk ik, ik heb geen specifieke MS dingen gebruikt (wel in VC++ gemaakt).

  • _cyclops_
  • Registratie: Mei 2000
  • Laatst online: 07-03-2025
Op woensdag 08 mei 2002 12:45 schreef Soultaker het volgende:

[..]

Als dat echt een bezwaar is kun je 'm gewoon statisch linken natuurlijk. Daarbij lijkt het me redelijk zinloos om pcre's te gebruiken als je zoiets simpels doet als jij nu.

Gewoon de huidige code blijven gebruiken dus, maar dan op de goede manier.
dit zijn simpele voorbeelden, 't wordt natuurlijk ook moeilijker :-)
maar, hoe is die goeie manier?

  • Orphix
  • Registratie: Februari 2000
  • Niet online
btw, voor m'n PCRE++ versie:
http://orphix.d2g.com/develop/pcrepp/index.php
:)
Ik ben later echter nogal wat bugs tegengekomen (en geen tijd om er verder aan te werken), dus heb geen idee of het allemaal nog werkt :P
Pagina: 1