[ASP] Syntax Highlighting

Pagina: 1
Acties:

  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Ik ben bezig met een syntax highlighter.

Nu leek het me dat doordat hij zooveel moet replacen hij best wel eens sloom zou kunnen worden met een rex exp.

Dus ging ik experimenteren.

Eerst deed ik het met een do loop.
Ik pakte in feite het stukje binnen " en " eruit en gaf dat een blauw kleurtje :).
zocht dan de volgende enzovoort.

Redelijk sloom, 278 regels duurde 0.3 seconde. Mij te sloom dus.


Ik besloot het met array's te proberen.
eerst heel simpel.

hier even het voorbeeldje:

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%
    'Split op de quotes
    TempBericht = split(strReplace,"""")

    'do tot ubound(TempBericht )
    for i=0 to UBOUND(TempBericht)

        'kijk of getal even is  
        if i Mod 2 = 1 then         
            'zo ja: geef shit ertussen een kleurtje
            TempBericht(i) = "&quot;<font color=""0000FF"">" & TempBericht(i) & "</font>&quot;"
        end if
    'loop!!!
    next
        
    strReplace = join(TempBericht,"")
%>


Dit duurde ook voor dezelfde 278 regels ongeveer 0.3 seconde.

Mij ook (uiteraard) weer te lang...

Is er een manier om dit sneller te parsen?
Zo ja, wat is sneller??

  • KurtDB
  • Registratie: Juni 2004
  • Laatst online: 13-05 09:19
Je uitleg is al niet consistent met je code. In je code ga je immers maar op de oneven lijnen checken naar strings.

Hetgeen jij volgens mij zoekt is de stringbuilder: http://msdn.microsoft.com...dnasp/html/aspstrcatn.asp

  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
KurtDB schreef op 06 november 2004 @ 17:59:
Je uitleg is al niet consistent met je code. In je code ga je immers maar op de oneven lijnen checken naar strings.
Hmz en hoezo is dat al ik vragen mag, beter perfomance?
Hetgeen jij volgens mij zoekt is de stringbuilder: http://msdn.microsoft.com...dnasp/html/aspstrcatn.asp
Ik snap niet wat dat met mijn probleem te maken heeft :) .

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

(jarig!)
ASP:
1
2
3
Set RegEx = New RegExp
RegEx.Pattern = """(.+?)"""
RegEx.Replace(strReplace, "<span style='string'>&quot;$1&quot;</span>")

Ja ik gebruik <span>, want <font> is nml depricated. Maar afgezien daarvan, gaat bovenstaande code (niet getest overigens) echt zoooo traag?

日本!🎌


  • KurtDB
  • Registratie: Juni 2004
  • Laatst online: 13-05 09:19
Mischa_NL schreef op 06 november 2004 @ 18:05:
[...]


Hmz en hoezo is dat al ik vragen mag, beter perfomance?
code:
1
2
        'kijk of getal even is    
        if i Mod 2 = 1 then


You tell me waarom je dat hier doet?
[...]


Ik snap niet wat dat met mijn probleem te maken heeft :) .
Een stringbuilder is sowieso sneller dan telkens je string opbouwen met &. (daarvoor is ie nu eenmaal gebouwd)

  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Er worden maar 3 stukjes aan elkaar geplakt, het initialiseren van de builder kost ook tijd.

  • CrashOne
  • Registratie: Juli 2000
  • Niet online

CrashOne

oOoOoOoOoOoOoOoOoOo

Een erg snelle string builder:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Class FastString

    Dim stringArray,growthRate,numItems
    
    Private Sub Class_Initialize()
        growthRate = 50: numItems = 0
        ReDim stringArray(growthRate)
    End Sub
    
    Public Sub Append(ByVal strValue)
        strValue = strValue & ""
        If numItems > UBound(stringArray) Then ReDim Preserve stringArray(UBound(stringArray) + growthRate)
        stringArray(numItems) = strValue:numItems = numItems + 1
    End Sub
    
    Public Sub Reset
        Erase stringArray
        Class_Initialize
    End Sub
    
    Public Function concat()
        Redim Preserve stringArray(numItems)
        concat = Join(stringArray, "")
    End Function
    
End Class


Is bij grotere strings echt veel sneller:
http://www.eggheadcafe.com/articles/stringClass.htm (IE only door clientside VB)

Huur mij in als freelance SEO consultant!


Verwijderd

Een StringBuilder is inderdaad stukken sneller. Dit komt omdat bij elke string bewerking een nieuw object wordt aangemaakt. De tijd gaat dus exponentieel toenemen met de lengte.

Hier loopt trouwens al een topic over, maar ik ben te lui om te zoeken :) wel geef ik nog een link die daar in stond over string builders :
http://www.microsoft.com/...003_07_stringbuilder.aspx

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

_Thanatos_ schreef op 06 november 2004 @ 20:49:
ASP:
1
2
3
Set RegEx = New RegExp
RegEx.Pattern = """(.+?)"""
RegEx.Replace(strReplace, "<span style='string'>&quot;$1&quot;</span>")

Ja ik gebruik <span>, want <font> is nml depricated. Maar afgezien daarvan, gaat bovenstaande code (niet getest overigens) echt zoooo traag?
Ben bang dat dat niet echt optimaal werkt in ASP, althans, niet als je de rest ook met een regexp gaat kleuren. Krijg je taferelen als keywords binnen strings die ook ineens gekleurd worden. In andere omgevingen dan ASP zou ik wijzen op tokenizen, maar ik ken die stringbuilder niet die hier aangehaald wordt, misschien is die wel sneller. Hou dan ook is ASP sowieso vrij traag met strings voor zover ik weet.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
KurtDB schreef op 06 november 2004 @ 20:51:
[...]

code:
1
2
        'kijk of getal even is    
        if i Mod 2 = 1 then


You tell me waarom je dat hier doet?


[...]


Een stringbuilder is sowieso sneller dan telkens je string opbouwen met &. (daarvoor is ie nu eenmaal gebouwd)
om dat ALLES tussen quotes staat tot en met de eerste en laatste quote...

<a href="lala" name="lala">lalala</a>
<a href="lala" name= "lala>lalala</a>

snappie ?
Verwijderd schreef op 06 november 2004 @ 21:13:
Een StringBuilder is inderdaad stukken sneller. Dit komt omdat bij elke string bewerking een nieuw object wordt aangemaakt. De tijd gaat dus exponentieel toenemen met de lengte.

Hier loopt trouwens al een topic over, maar ik ben te lui om te zoeken :) wel geef ik nog een link die daar in stond over string builders :
http://www.microsoft.com/...003_07_stringbuilder.aspx
Ik lees daar dat het voor .net is. Daar heb ik dus niet zo veel aan ;)...

Iemand nog andere suggesties?

En heeft iemand een nederlandse site over tokenizen?
Lijkt me wel een mooi idee, maar redelijk complex volgens mij...

EDIT// Dan heb ik nog een vraagje. ik heb gehoord dat het mogelijk is om in ASP met c++ te schrijven. Is dit sneller en werkt dit een beetje?
Dat zou mooi zijn voor functies als een parser of iets namelijk.

[ Voor 11% gewijzigd door Mischa_NL op 06-11-2004 21:53 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Mischa_NL schreef op 06 november 2004 @ 21:50:
En heeft iemand een nederlandse site over tokenizen?
Lijkt me wel een mooi idee, maar redelijk complex volgens mij...
Ik had zelf eens een topic hierover, daar staan wat linkjes in naar documenten over tokenizen: [rml][ PHP] Universele syntax highlighter - voorbereiding[/rml]
Mischa_NL schreef op 06 november 2004 @ 21:50:
EDIT// Dan heb ik nog een vraagje. ik heb gehoord dat het mogelijk is om in ASP met c++ te schrijven. Is dit sneller en werkt dit een beetje?
C#, niet C++ (AFAIK). Volgens mij is het met strings iets sneller, maar daar ben ik niet zeker van.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Dat topic vond ik met de search...
link die erin staat is een heel boekwerk man tokenization
Mischa_NL schreef op 06 november 2004 @ 17:49:

[...]

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%
    'Split op de quotes
    TempBericht = split(strReplace,"""")

    'do tot ubound(TempBericht )
    for i=0 to UBOUND(TempBericht)

        'kijk of getal even is  
        if i Mod 2 = 1 then         
            'zo ja: geef shit ertussen een kleurtje
            TempBericht(i) = "&quot;<font color=""0000FF"">" & TempBericht(i) & "</font>&quot;"
        end if
    'loop!!!
    next
        
    strReplace = join(TempBericht,"")
%>


Dit duurde ook voor dezelfde 278 regels ongeveer 0.3 seconde.

[...]
Dit was niet de oorzaak van het hele slome btw. Het probleem was dit (ff in pseudocode)

code:
1
2
3
4
5
6
7
arraymessage = split(message,"<br />")

for i=0 to ubound(arraymessage)

parsedcode = parsedcode & i & arraymessag(i)

next


Dit moest zijn

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                'init var linenumber = 1 (d0h)
                lnglinenumber = 1

                'split the code and put in array
                codestring = split(strMessagebold, "<br />")
                
                'do from line 1 to last line
                for i=0 to UBOUND(codestring)
                    'parse line of code
                    codestring(i) = "<tr><td style=""font-size: 13px;"" bgcolor=""lightgray"" align=""right"" valign=""top"">&nbsp;" & lngLineNumber & "&nbsp;</td><td style=""font-size: 13px;"">" & codestring(i) & "</td></tr>"
                    'set linenumber + 1
                    lnglinenumber = lnglinenumber + 1
                'loop
                next

                parsedcodestring = join(codestring,"")


Nu vul ik de array bij en join ik op het eind.

van de 0.33 seconden op 437 regels html alleen de quotes kleur geven zijn er nog 0.07 over. Echter nog steeds te langzaam, aangezien hij nog 40+ tags moet parsen per taal...

Ik zal eerst eens opzoeken hoe het zit met C# want er is een C# versie voor dat stringbuilder geval! :)

[ Voor 23% gewijzigd door Mischa_NL op 07-11-2004 00:18 . Reden: foutje moet kunnen... ]


Verwijderd

code:
1
for i=0 to UBOUND(TempBericht)
Ietsiepietsie sneller is:
code:
1
2
3
dim u
u = UBOUND(TempBericht)
for i = 0 to u


en misschien kun je
code:
1
i mode 2 =1
vervangen door
code:
1
2
3
4
5
6
dim b
b = true
for ...
...
  b = not b
  if b then ...


Moet je overigens persee die string in het geheugen ombouwen? Kun je niet meteen de uitvoer met response.write naar de user sturen? Dat is namelijk veel sneller.

  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Het is een UBB parser die code highlight dus dat gaat helaas niet...

Je hebt een bericht.
Je roept de functie ubbparse(bericht) aan.
Deze parsed heel het bericht wat overigens lekker snel gaat.
Dan komt hij binnen de code tag ([code] lalalala [/code]).
Dan roep ik een andere functie binnen de ubbparse() functie aan om er een kleur aan te geven.

Niet mogelijk om het rechtstreeks te response writen.

Daar komt nog eens bij dat mijn app gebruikt maakt van templates en dus alle html apart staat. Daarom is het ookal niet mogelijk aangezien alles in vars word doorgestuurd met de template parser die nagebouwd is van de php template parser...
Verwijderd schreef op 07 november 2004 @ 09:50:
[...]

Ietsiepietsie sneller is:
code:
1
2
3
dim u
u = UBOUND(TempBericht)
for i = 0 to u


en misschien kun je
code:
1
i mode 2 =1
vervangen door
code:
1
2
3
4
5
6
dim b
b = true
for ...
...
  b = not b
  if b then ...
Ik zal dat van jou eens even proberen.

EDIT/ Op 294 regels is het verschil niet merkbaar tijd om te parsen is voor 0.0719 en daarna ook...
Het zal best wel iets helpen, op grote stukken lijkt me.
Maar ik moet dus echt die tijd flink inkorten...

[ Voor 33% gewijzigd door Mischa_NL op 07-11-2004 10:19 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Mischa_NL schreef op 07 november 2004 @ 00:17:
Dat topic vond ik met de search...
link die erin staat is een heel boekwerk man tokenization
Ok, dus je wil het per se allemaal sneller hebben (terwijl 0.07 sec voor 400+ regels al best snel is voor ASP), maar je wil niet dat document lezen wat je daarmee verder helpt? :? Ik maak tenminste uit je volgende posts niet op dat je er wat mee doet/gaan doen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Ik wil er wel wat mee doen, maar wat ik eruit opmaak is dat je alles is array/vars moet zetten?
Ik heb het niet helemaal doorgelezen maar ik snap niet waarom het zo sneller zou worden.

Als ik het goed begrijp zit het zo:

Je zet alle woorden los in een array en op die manier kun je kleuren enzovoort?
Klopt dit een beetje?

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

(jarig!)
Krijg je taferelen als keywords binnen strings die ook ineens gekleurd worden.
Daar heb je dan weer CSS voor :z

日本!🎌


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 16:00

crisp

Devver

Pixelated

_Thanatos_ schreef op 07 november 2004 @ 15:05:
[...]


Daar heb je dan weer CSS voor :z
Ik zou sowieso geen hardcoded kleuren in de output zetten, maar dat netjes oplossen met CSS classes ;)

Intentionally left blank


Verwijderd

Op 294 regels is het verschil niet merkbaar tijd om te parsen is voor 0.0719 en daarna ook...
Het zal best wel iets helpen, op grote stukken lijkt me.
Maar ik moet dus echt die tijd flink inkorten...
Heb je al geprobeerd je code in een Vb6 ActiveX-dll te zetten? In theorie is dat ongeveer 10x zo snel als vbscript. Alleen wil de overhead van ActiveX wel eens roet in het eten gooien.

  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Dit is redelijk interessant.

Nu heb ik wel even gezocht op google maar een paar dingen kan ik niet echt vinden.

Wel vind ik dat soms de code wel 300+ x sneller uitgevoerd word, en dat is heel mooi.

MAAR, is een activex-dll een bestand dat ik gewoon in mijn www root kan gooien? of is dit dan echt een component?

Als het een component is houd het op want ik kan geen eigengemaakte componenten uploaden oid op mijn host (vevida).

Dan, Is het gewoon vbscript wat ik in de activex-dll zet? gewoon met visual basic 6.0 ofzo in elkaar zetten?

Verwijderd

ActiveX dll's moeten op de server geregistreerd worden. Als je systeembeheerder daar geen zin in heeft kun je eens kijken naar deze pagina: http://www.eggheadcafe.com/articles/20010819.asp . Je moet dan wel de rechten hebben om dat te doen natuurlijk.

Het makkelijkst om een activeX-dll te maken is VB6. Je kunt dan je code vrij wel een op een over zetten. Het moet wel in een class zitten, anders kun je er van buiten af niet bij. Voorbeelden zijn er genoeg te vinden op google en msdn.

Overigen die 300x snelheid winst heb ik nog nooit gehaald. 10x wel.

[ Voor 8% gewijzigd door Verwijderd op 09-11-2004 21:50 ]


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 16-05 11:22
Is het geen idee de code al te highlighten bij het wegschrijven in de DB? Dan hoef je bij een request niet meer te parsen.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1