[ASP] Snel replacen

Pagina: 1
Acties:

  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Op mijn forum heb ik, net als op vele andere fora, ook smilies...

Is heel leuk en aardig maar het replacen ven de tags naar de smilie gaa ontiegelijk langzaam.
Voor 20 berichten met gemiddeld 3 smilies in een bericht heeft hij +/- 0.18 seconden nodig...

Ik doe dit op deze manier:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
'are smilies enabled?!
if blnSmiliesEnabled = true then
    
    Dim smiliereplace
    Set smiliereplace = Server.CreateObject("ADODB.Recordset")

    'if so query the database for them.
    SQL = "SELECT smilie_url, smilie_tag FROM tblSmilies"
    smiliereplace.open SQL,adocon,3,3

    'so while not all smilies replaced
    do while not smiliereplace.EOF
    
        Bericht = replace(Bericht,smiliereplace("smilie_tag"),"[img]"[/img]",1,-1,0)
    
    smiliereplace.movenext
    loop
            
end if


Is er geen manier om die dingen sneller te vervangen? :?
Dit neemt namelijk 2/3e van het hele parsen in beslag op dit moment 8)7 .

  • moto-moi
  • Registratie: Juli 2001
  • Laatst online: 09-06-2011

moto-moi

Ja, ik haat jou ook :w

Waarom parse je de zooi realtime ?
Als je zorgt voor 2 tabellen in je db, een met html meuk, en eentje zoals het wordt ingetyped door de gebruiker wordt het opeens al een stuk sneller denk ik ;)

God, root, what is difference? | Talga Vassternich | IBM zuigt


  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
beetje onlogisch lijkt me ...

Heb je like HUGE veel shit in je database staan... die helemaal onnodig is. :)
Het is idd dan wel stukken sneller maarja, je posts tabel wordt meer dan 2 keer zo groot...

Is er geen andere oplossing ?

Doet React het ook op deze manier ? Daar ben ik wel benieuwd naar. :)

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

React slaat inderdaad ook een geparsede en ongeparsede versie op :)

Intentionally left blank


  • Ramon
  • Registratie: Juli 2000
  • Laatst online: 21:58
het is misschien niet logisch, maar de grootte van je posts-tabel wordt bij lange na niet 2x zo groot en als je snelheid nodig hebt is het eigenlijk de makkelijkste en snelste optie.

Check mijn V&A ads: https://tweakers.net/aanbod/user/9258/


  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
hmz hmz ik zal erover nadenken...

Het is heel wat werk om het helemaal om te bouwen moet ik eerlijk zeggen...
Aangezien mijn forum zo een beetje richting de 1.0 versie gaat/ging.

En de ongeparste versie gebruik je voor de edit's ?

Een ander probleem wat me te binnen schiet.
Ik heb dit staan [b]lalala[/b] om iets bold te maken. Nu denk ik: naah ik verander de tag toch maar in [bold].

Dan heb je een heel klein probleempje...
Hetzelfde geld voor smilies..

Daar is dan niks aan te doen lijkt me?

EDIT/ Iemand nog een idee om het anders op te lossen?

[ Voor 7% gewijzigd door Mischa_NL op 11-12-2004 17:49 ]


  • moto-moi
  • Registratie: Juli 2001
  • Laatst online: 09-06-2011

moto-moi

Ja, ik haat jou ook :w

Mischa_NL schreef op zaterdag 11 december 2004 @ 17:48:
hmz hmz ik zal erover nadenken...

Het is heel wat werk om het helemaal om te bouwen moet ik eerlijk zeggen...
Aangezien mijn forum zo een beetje richting de 1.0 versie gaat/ging.
En de ongeparste versie gebruik je voor de edit's ?
Jups, terugparsen wil je niet , dat gaat namelijk te vaak fout ;)
Een ander probleem wat me te binnen schiet.
Ik heb dit staan [b]lalala[/b] om iets bold te maken. Nu denk ik: naah ik verander de tag toch maar in [bold].
Dan heb je een heel klein probleempje...
Hetzelfde geld voor smilies..
Daar is dan niks aan te doen lijkt me?
Dat zal in je oude ontwerp ook een probleem zijn lijkt me ;)
Maar sowieso kun je in je db een search-and-replace actie doen ;)

God, root, what is difference? | Talga Vassternich | IBM zuigt


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 01-04 20:36

Not Pingu

Dumbass ex machina

Ik zie dat je continu een recordset hebt openstaan tijdens het parsen van smilies. Is uitbreiding van de smilie-mogelijkheden echt zo belangrijk? Anders kun je imho net zo goed de smilies gewoon hardcoden en de hele database-stap weglaten. Ik denk eerlijkgezegd dat dat het grootste probleem is.

Ik heb zelf ook (lang geleden :P) een forum in ASP gemaakt met een redelijk uitgebreide parser en dat draait harstikke goed

Certified smart block developer op de agile darkchain stack. PM voor info.


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:45

gorgi_19

Kruimeltjes zijn weer op :9

Verder kan je je afvragen of je de smiley's niet wil cachen in een Application variabele en / of Dictionary object ipv continue een database connectie te maken.

[ Voor 17% gewijzigd door gorgi_19 op 12-12-2004 10:58 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
hmz daar zit wat in. want het is idd de database connectie het hem doet...

Dat zal ik eens uitproberen!

bedankt voor de hulp!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:45

gorgi_19

Kruimeltjes zijn weer op :9

Mischa_NL schreef op zondag 12 december 2004 @ 13:36:
hmz daar zit wat in. want het is idd de database connectie het hem doet...

Dat zal ik eens uitproberen!

bedankt voor de hulp!
Laat anders, als je het uitgeprobeerd hebt, ook even het resultaat hier weten :) Mochten mensen in de toekomst dit topic tegen komen, dan zien ze iig een oplossing; wellicht dat iemand die jouw oplossing ziet nog suggesties heeft om het nog verder te optimaliseren :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Azzmodan
  • Registratie: Juni 2000
  • Laatst online: 17:28
Het helpt waarschijnlijk ook als je je recordset readonly opent, en forwardonly.
Nu open je hem static en met een optimistic lock, en dat kost allemaal onodige tijd, aangezien je er alleen maar even snel van begin to eind door heen wilt rennen.

Om dat aan te passen moet je het volgende veranderen:
code:
1
smiliereplace.open SQL,adocon,3,3

In:
code:
1
smiliereplace.open SQL,adocon,0,1


Ik zou ook aanraden om adovbs.inc te gebruiken, want dan krijg je iets als dit:
code:
1
smiliereplace.open SQL,adocon,adOpenForwardOnly,adLockReadOnly

En dat is veel makkenlijker terug te lezen later :)

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:45

gorgi_19

Kruimeltjes zijn weer op :9

Azzmodan schreef op zondag 12 december 2004 @ 16:36:
Ik zou ook aanraden om adovbs.inc te gebruiken, want dan krijg je iets als dit:
code:
1
smiliereplace.open SQL,adocon,adOpenForwardOnly,adLockReadOnly

En dat is veel makkenlijker terug te lezen later :)
Ja, maar ook een stuk trager. Je moet continue dat bestand gaan includen voor een paar constanten.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Azzmodan
  • Registratie: Juni 2000
  • Laatst online: 17:28
gorgi_19 schreef op zondag 12 december 2004 @ 17:41:
[...]
Ja, maar ook een stuk trager. Je moet continue dat bestand gaan includen voor een paar constanten.
Je kan ook een typelib gebruiken, zelfde voordeel maar geen groot bestand om te includen, ik geloof dat die pagina waar ik naar verwees een link had met uitleg daarover.

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 19:12

sopsop

[v] [;,,;] [v]

gorgi_19 schreef op zondag 12 december 2004 @ 17:41:
[...]

Ja, maar ook een stuk trager. Je moet continue dat bestand gaan includen voor een paar constanten.
zoveel trager zal het niet worden van dit bestandje:
code:
1
2
3
4
5
6
7
8
9
10
11
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3
Const adHoldRecords = &H00000100
Const adMovePrevious = &H00000200
Const adAddNew = &H01000400
Const adDelete = &H01000800
Const adSimpleRecord = 0
Const adCollectionRecord = 1
Const adStructDoc = 2
Meer is het niet. Tenminste, dit is een gestripte. Een volledige kun je hier vinden:
http://www.4guysfromrolla.com/webtech/code/adovbs.txt
Maar over het algemeen worden de constanten die hierboven staan gebruikt.

[ Voor 15% gewijzigd door sopsop op 13-12-2004 13:14 ]


  • j_du_pee
  • Registratie: Maart 2000
  • Laatst online: 23-09-2024

j_du_pee

du pain, du vin, du pee

Als bovenstaande nou niet werkt, zou je evt er ook nog aan kunnen denken om met javascript op de client te gaan parsen. Ik zou er liever niet voor kiezen, maar het is een mogelijkheid, is de server iig een hoop load kwijt :)

kaart != map && bottel != fles
Wacht op antwoord


  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Dat op een andere manier openen haalt al redelijk wat van de tijd af inderdaad.
Was stom om hem met 3,3 te openen ja.

Maar als ik het in een app object zou zetten. moet ik die gewoon 1 keer in de 15 minuten updaten ofzo? Of voor iedere parse van 1 pagina? wat zou het slimst zijn?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:45

gorgi_19

Kruimeltjes zijn weer op :9

Mischa_NL schreef op maandag 13 december 2004 @ 17:23:
Dat op een andere manier openen haalt al redelijk wat van de tijd af inderdaad.
Was stom om hem met 3,3 te openen ja.

Maar als ik het in een app object zou zetten. moet ik die gewoon 1 keer in de 15 minuten updaten ofzo? Of voor iedere parse van 1 pagina? wat zou het slimst zijn?
1x, totdat je hem wijzigt.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
ohja dat kan ook nog....

maar het probleem is dat ik dan heel wat application variabelen moet hebben wat volgens mij niet echt goed is voor de server heb ik weleens gehoord.

Misschien is het slimmer de smilies in een array te pleuren en deze in 1 app var te zetten?
Lijkt mij de beste oplossing, doe ik ook met user online status.

Ik ga het zo proberen, resultatan zal ik hier neerzetten!

  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Ik zal het even in een nieuwe post samenvatten!

Ik heb een application variable gebruikt met daarin een array met alle smilies!

hier komtie!

Visual Basic:
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
27
28
29
30
31
32
33
34
sub smilieprepare()

    'kijk of dat ding bestaat (en dus array is)
    If isarray(application("Array_smilies")) = false Then 
        
        Dim smiliereplace
        Set smiliereplace = Server.CreateObject("ADODB.Recordset")
    
        'haal smilies uit de database
        SQL = "SELECT smilie_url, smilie_tag FROM tblSmilies"
        smiliereplace.open SQL,adocon,3,3

        'Redimmen, dimmen pikt hij niet met een niet constante erin :X
        ReDim Array_smilies(smiliereplace.recordcount,1)
        i=0
        
        'loopen en de smilies in de array zetten
        do while not smiliereplace.EOF

            Array_smilies(i,0) = smiliereplace("smilie_tag")
            Array_smilies(i,1) = smiliereplace("smilie_url")        
        
            i=i+1
            smiliereplace.movenext
        loop

    'smilies in appliacation var zetten
      Application.Lock
        Application("Array_smilies") = Array_smilies
      Application.Unlock

    End If

end sub


Dan nu het replacen van de smilies:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
    ' functie hierboven uitvoeren om te kijken of application var bestaat: zo niet aanmaken
    smilieprepare()

    ' ophalen variablen
    Array_smilies = Application("Array_smilies")

    'loopen en replacen!
    for i=0 to UBound(Array_smilies)

        Bericht = replace(Bericht,Array_smilies(i,0),"[img]"[/img]")

    next


Het is van gemiddeld: 0.15 naar 0.03 seconden gegaan!

Bedankt voor de hulp allemaal! _/-\o_

[ Voor 16% gewijzigd door Mischa_NL op 13-12-2004 22:11 ]


Verwijderd

Eerst kijken of er iets te replacen is met instr wil bij lange strings de performance ook wel een opschroeven omdat er dan minder string-allocaties zijn, dus:
Visual Basic:
1
2
3
if instr(Bericht,Array_smilies(i,0))>0 then
  Bericht = replace(Bericht,Array_smilies(i,0),"[img]"[/img]")
end if

Performance verbetering is te merken bij strings groter dan 32KB.
Pagina: 1