Avatar billede per1291 Nybegynder
10. september 2005 - 15:42 Der er 16 kommentarer og
1 løsning

RegExp: Eksempel på en tidsrøvende funktion?

En brugerkommentar til min artikel "Søg og erstat med Regexp" efterlyser dokumentation for min påstand om, at RegExp kan gøre koden ikke alene kortere, men også hurtigere.

Se på dette eksempel:

function deleteFormtags(Inputtekst)
{
var reg = /</?(b|i|u)>/ig;
var erstat="";
return Inputtekst.replace(reg,erstat);
}

Koden kan sammenkoges til en enkelt linje.

Uden RegExp ville sådanne opgaveR tage længere tid:
Hvis opgaven er blot en lille smule mere kompliceret, vil man uden RegExp være nødt til at definere en stakstruktur med push og pop og andre finesser, og hver programlinje ville tage tid at udføre.

Jeg ved, at det er muligt at konstruere en funktion indeholdende RegExp, som det vil tage en hulens tid at udføre.
Men jeg er overbevist om, at uden brug af RegExp ville den samme opgave tage endnu længere tid.

Er der nogen af jer, der har et eksempel på en tidsrøvende RegExp-funktion?
Avatar billede olebole Juniormester
10. september 2005 - 15:51 #1
<ole>

Ja, enhver RegExp er en tidsrøver - men om den røver mere tid end noget kode, der gør det samme uden RegExp, kommer anpå den enkelte opgave  :)

RegExp-motoren er ikke umiddelbart nogen letvægter ... det er et komplekst kodesvin at starte op. Derfor er RegExp aldrig første-valget - men ender ofte med at blive valget  ;o)

/mvh
</bole>
Avatar billede busschou Praktikant
10. september 2005 - 15:52 #2
Jeg skulle lige til at skrive at det jo var mig som havde lavet den kommentar i artiklen samt at jeg mente at det var olebole som havde snakket om tidsrøveri før
Men det er vist så lige blevet overflødigt ;o)
Avatar billede olebole Juniormester
10. september 2005 - 15:53 #3
- og det, at en kode kan koges ned til én linje, er absolut ikke altid en fordel. Hverken hvad overskuelighed eller performance angår  :)
Avatar billede per1291 Nybegynder
10. september 2005 - 15:55 #4
Aha. Selve opstarten kræver tid. Men derefter, når maskinen er i sving - så er den vel hurtig nok?
Hvis jeg nu laver en test, hvor jeg f.eks. kalder RegExp-maskinen 1000 gange - vil den så skulle bruge 1000 opstarter?
Avatar billede busschou Praktikant
10. september 2005 - 16:09 #5
per1291 >> sådan en funktion til at slette tags med i html koden, der mener jeg at javascript har indbygget en replace funktion. Jeg har ikke testet det, måske den er optimeret, måske den ikke er. Men der er ikke behov for en push/pop stak struktur hvis man benytter den. Det er blot at lave et array med samtlige html tags og så lave en løkke som for hvert tag replacer det med "" :o)
Avatar billede per1291 Nybegynder
10. september 2005 - 16:17 #6
busschou -> Ikke enig. Et HTML-tag kan fx være <td style="">. - Hilsen Per
Avatar billede per1291 Nybegynder
10. september 2005 - 16:26 #7
Nå, men det jeg tænkte på, det var en RegExp som ville indebære et hav af trial-and-error. De findes, jeg ved det godt. Måske noget med indlejrede parenteser. Måske noget rekursions-agtigt. Jeg savner et konkret eksempel. - Hilsen Per
Avatar billede olebole Juniormester
10. september 2005 - 16:31 #8
Nej, en RegExp-søgning er naturligvis langt mere kompleks end en streng-søgning  :)

Ikke:
  if (s.match(/ole/g)) alert("Indeholder 'ole'");

- men:
  if (s.indexOf("ole")!=-1) alert("Indeholder 'ole'");

Derudover er dine forklaringer om RegExp-constructor'en lidt overfladisk. Den er smart (nødvendig) at bruge, når man skal bruge dynamiske mønstre - men er mønstret statisk, bør man bruge en literal, da mønstret så ikke skal kompileres runtime og motoren derfor performer bedre.

Dernæst afhænger valget af metoder af, hvad der skal udføres - vægtet mod performance. Skal du bare vide, om en et mønster eksisterer, kan du passende bruge search() eller test() - som er hurtigere end match() og exec().
Er mønstret ikke mere komplekst, end det kan findes med en alm. metode på String-objektet, bør en sådan naturligvis anvendes.

_Hvis_ en tabel-celle kan indeholde en inline style-attribut i den aktuelle sammenhæng, så er det korrekt, at det er en fordel (nødvendighed) at bruge RegExp ... ellers ikke.
Det kan dels afhænge af applikationen, hvor det skal bruges - og dels af markup-versionen. Således er inline-styles ikke en option i næste markup-version, men det er en detalje i denne sammenhæng  :)
Avatar billede per1291 Nybegynder
10. september 2005 - 16:44 #9
Ole -> Dit hint vedr. statisk kontra dynamisk er virkelig oplysende.

Jeg kender ikke de planer der ligger for næste HTML-version. Hvor ved du det fra?

- Efterlyser stadig et eksempel, men nu er det ikke længere så vigtigt, for jeg har fået mere at tygge på.

Læg et svar. - Hilsen Per
Avatar billede olebole Juniormester
10. september 2005 - 17:19 #10
I XHTML2.0 kan styles ikke sættes inline - kun via stylesheet. Det ved jeg fra W3C  ;o)

Mit eksempel med match kontra indexOf er et oplagt eksempel - men derudover er der, så vidt jeg ved, forskelle på implementeringen af ECMA i de forskellige browsere på punkter, der vedrører dette.

I IE vil et udtryk som:
  s = s.replace("ole", "torsk");
- ikke forsøge at konvertere den første streng til en RegExp. Udskiftningen sker udelukkende ved brug af String-objektet - hvilket, alt andet lige, er hurtigere, end når man skal ligge og juggle mellem String- og RegExp-objekterne.

Jeg er ikke 100% sikker på, hvad der sker i Gecko's implementering, da det ikke explicit er nævnt. Jeg har dog på fornemmelsen, at RegExp under alle omstændigheder anvendes her(?)
Avatar billede olebole Juniormester
10. september 2005 - 17:22 #11
Det er i øvrigt nævnt i JavaScript1.5-Guide'en - som jeg endelig har fundet en version af under mozilla.org:
  http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Creating_a_Regular_Expression
Avatar billede olebole Juniormester
10. september 2005 - 17:23 #12
- altså det, jeg skrev omkring dynamikken og constructor'en  :)
Avatar billede olebole Juniormester
10. september 2005 - 17:24 #13
- og til alle interesserede ligger der her et par *guld-klumper*:
  http://developer.mozilla.org/en/docs/Category:java script:References
Avatar billede olebole Juniormester
10. september 2005 - 17:39 #14
Per >> lige en anden lille en til 'tyggeren'  ;o)
Når vi opdager noget nyt og kaster os over det med stor entusiasme, ligger det somregel 'i den anden grøft'. Vi springer op og myldrer hen over asfalten for at kaste os frådende og småræbende af fryd ned til nyfundne. I den forbindelse er det, jeg plejer at skrive:
    Mellem to dybe grøfter ligger ofte en farbar vej

Min gamle underbo, der levede af at oversætte tegneserier, havde en ret ubetalelig beskrivelse af fænomenet:
    For en mand med en ny hammer kommer alt til at ligne søm

- den giver mig ofte nogle _meget_ morsomme billeder på den indre Technicolor!  :D

Det er ikke nogen kritik, men blot noget, du skal have med i overvejelserne  :)
Avatar billede per1291 Nybegynder
10. september 2005 - 18:41 #15
Ole, igen tak.
Min artikel skal muligvis udbygges, men foreløbig synes jeg den er bedre end ingen artikel. Jeg kunne jo ikke blive ved med at plage folk om oplysninger vedr. alle mulige "hjørner" af RegExp, for så at skrive en artikel om et par år.

Læg nu et svar. - Hilsen Per
Avatar billede olebole Juniormester
10. september 2005 - 18:51 #16
Den er _absolut_ bedre end ingen artikel - og bærer tydeligt præg af, at du prøver at sætte dig grundigt ind i stoffet  ;o)
Avatar billede olebole Juniormester
10. september 2005 - 19:09 #17
tak for points  :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

PlanBørnefonden

Full Stack Developer

Forsvarsministeriets Materiel- og Indkøbsstyrelse

SAP Bruger- og rolleadministrator ved Forsvarsministeriets Regnskabsstyrelse

Rambøll Management Consulting

Senior Software Engineer

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Analytiker til Security Operationscenter i Cyberdivisionen Hvidovre