10. september 2005 - 15:42Der 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?
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)
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)
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?
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)
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
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 :)
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(?)
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 :)
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.
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.