=?iso-8859-2?Q?=5BVB6=5D_D=A3UGIE_optymalizacja...?=
BaGRoS - 17-03-2006 00:34
=?iso-8859-2?Q?=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Cześć!
Mam takie dane: "<tr class=o2><td class=atc>J</td><td class=nc>GeForce 6200A Asus 256MB (64-bit) TV/DVI BOX (AGPx8)</td><td class=c>180</td><td class=c>178</td><td class=o>wersja BOX, obsługa DirectX 9.0, 128MB pamięci 64-bit, wyjście DVI i wyjście video (S-video out), nVidia CineFX 3.0m nVidia Ultra Shadow II</td><td class=n>jest</td><td class=n>36</td><td class=l2><a href="http://www.ktr.pl/mapper.php?kod=GRGFX62AS62A256TD64B">4</a></td></tr>"
rozbijam je na części pierwsze:
START:
With KTR
'TU SIE BEDZIE DZIALO 'szukam początku a jednoczesnie promocji txt = "<tr class=o2><td class=" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) .Promocja = Mid(CennikTXT, POZ, 3) 'znam dlugosc wiec koniec PROMOCJI
'szukam nazwy POZ = POZ + 3 txt = "<td class=n" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) 'szukam poczatku napisu txt = ">" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + 1 'B będzie początkiem opisu B = POZ 'szukam konca txt = "</td>" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) .Nazwa = Mid(CennikTXT, B, A - B) 'koniec nazwy
'szukam Cena1 txt = "<td class=c" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) 'szukam poczatku napisu txt = ">" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + 1 'B będzie początkiem opisu B = POZ 'szukam konca txt = "</td>" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) .Cena1 = Mid(CennikTXT, B, A - B) 'koniec Cena1
'szukam Cena2 txt = "<td class=c" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) 'szukam poczatku napisu txt = ">" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + 1 'B będzie początkiem opisu B = POZ 'szukam konca txt = "</td>" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) .Cena2 = Mid(CennikTXT, B, A - B) 'koniec Cena2
'szukam Opis txt = "<td class=o" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) 'szukam poczatku napisu txt = ">" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + 1 'B będzie początkiem opisu B = POZ 'szukam konca txt = "</td>" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) .Opis = Mid(CennikTXT, B, A - B) 'koniec Opis
'szukam Dostepnosc txt = "<td class=n" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) 'szukam poczatku napisu txt = ">" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + 1 'B będzie początkiem opisu B = POZ 'szukam konca txt = "</td>" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) .Dostepnosc = Mid(CennikTXT, B, A - B) 'koniec Dostepnosc
'szukam Gwarancja txt = "<td class=n" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) 'szukam poczatku napisu txt = ">" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + 1 'B będzie początkiem opisu B = POZ 'szukam konca txt = "</td>" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) .Gwarancja = Mid(CennikTXT, B, A - B) 'koniec Gwarancja
'szukam Adres URL txt = "<td class=l2>" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) 'szukam poczatku napisu txt = "<a href=" + Chr$(34) A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) 'B będzie początkiem opisu B = POZ 'szukam konca txt = Chr$(34) + ">4</a>" A = InStr(POZ, CennikTXT, txt, vbTextCompare) If A < 1 Then GoTo KONIEC End If POZ = A + Len(txt) .AdresURL = Mid(CennikTXT, B, A - B) 'z adresu biorę KOD .KOD = Mid(.AdresURL, 34, Len(.AdresURL) - 33) 'koniec AdresURL i KOD
Towar = Towar + 1
'Debug.Print POZ, .Promocja, .Nazwa, .Cena1, .Cena2, .Opis, ..Dostepnosc, .Gwarancja, .AdresURL, .KOD
End With frm_Start.lbl.Caption = "Towar numer:" + Str(Towar) DoEvents frm_Start.ProgressBar1.Value = POZ GoTo START
KONIEC:
ktoś ma pomysł jak to przyspieszyć??!! Powiedzmy 10 krotnie :P Len(txt) mógłbym powymieniać, troszkę by pomogło, lecz zbyt mało... W razie zmiany szukanego txt automatycznie dobrze ustawi mi się długość. Pomysły?
-- BaGRoS / GG#11282 / [at]tlen[dot]pl PC=Athlon64/RAM 1GBTwinMos/HDD 420GB/LiteOn812->832/... FOTO=CanonEOS300D->10D+KitII+50mm/f1.8+1GBPretecX80/CanonA60+128MB CF... PocketPC=MDA III+1GB SD/Loox600+256MB SD+64MB CF
Artur S. - 17-03-2006 00:34
BaGRoS napisał(a): > Cześć! > [...] Witam, poczepiam się :)
1. Masz dużo niejawnych konwersji. Właściwie w każdej linii. A, POZ są zadeklarowane? Masz Option Explicit ? 2. A<1 zmień na A=1 3. Mid zmień na Mid$ (powyższe punkty nie dadzą Ci czadu, ale będzie ładniej:) ) 4. Stawiam na DoEvents. Pewnie robisz to w pętli 10tys. razy. Zakomentuj i zobacz czy masz 10 czy tylko 7 razy szybciej ;) Jeśli to jest to, to pozostanie Ci refresh labela i nie tak częste zmienianie wartości ProgressBar.
Pozdrawiam Artur S.
PS. i to brzydkie GoTo, ale jak chcesz szybko to niech zostanie...
BaGRoS - 17-03-2006 00:34
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Artur S. wrote: > BaGRoS napisał(a): >> Cześć! >> > [...] > Witam, > poczepiam się :) > > 1. Masz dużo niejawnych konwersji. Właściwie w każdej linii. A, POZ są > zadeklarowane? Masz Option Explicit ?
tak na początku Option Explicit
Dim A, B, C, POZ As Long --- 7MB ma pliczek.... Dim Towar As Integer Dim txt As String
> 2. A<1 zmień na A=1
ok
> 3. Mid zmień na Mid$ > (powyższe punkty nie dadzą Ci czadu, ale będzie ładniej:) )
jest
> 4. Stawiam na DoEvents. Pewnie robisz to w pętli 10tys. razy.
tak, ale i tak było wolno, tak widzialem ile już zrobił no i system działa "normalnie :P" wyświetlanie dla testu, progress też... nawet formatki nie potrzebuje
> Zakomentuj i zobacz czy masz 10 czy tylko 7 razy szybciej ;) Jeśli to > jest to, to pozostanie Ci refresh labela i nie tak częste zmienianie > wartości ProgressBar.
j/w
> Pozdrawiam > Artur S.
> PS. i to brzydkie GoTo, ale jak chcesz szybko to niech zostanie...
Dzięki za odzew. Co myślisz gdyby napisać w C#/c++ bibliotekę do przeszukiwania tych wartości? Może inny szybszy sposób?
-- BaGRoS / GG#11282 / [at]tlen[dot]pl PC=Athlon64/RAM 1GBTwinMos/HDD 420GB/LiteOn812->832/... FOTO=CanonEOS300D->10D+KitII+50mm/f1.8+1GBPretecX80/CanonA60+128MB CF... PocketPC=MDA III+1GB SD/Loox600+256MB SD+64MB CF
Robert Winkler - 17-03-2006 00:34
> tak na początku Option Explicit > > Dim A, B, C, POZ As Long --- 7MB ma pliczek....
Ta deklaracja oznacza w VB6 naprawdr cos takiego:
Dim A As Variant Dim B As Variant Dim C As Variant Dim POZ As Long
Oczywiscie to drobiazg, ale pokazuje prawdziwe zachowanie VB6. -- ____________ Robert Winkler
BaGRoS - 17-03-2006 00:34
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Robert Winkler wrote: >> tak na początku Option Explicit >> >> Dim A, B, C, POZ As Long --- 7MB ma pliczek.... > > Ta deklaracja oznacza w VB6 naprawdr cos takiego: > > Dim A As Variant > Dim B As Variant > Dim C As Variant > Dim POZ As Long > > Oczywiscie to drobiazg, ale pokazuje prawdziwe zachowanie VB6.
Ta zmiana (na LONG dla wszystkich :P) przyniosła zerowe (małe) przyspieszenie przy 100 przejściach... Mam ich 12500 :/
-- BaGRoS / GG#11282 / [at]tlen[dot]pl PC=Athlon64/RAM 1GBTwinMos/HDD 420GB/LiteOn812->832/... FOTO=CanonEOS300D->10D+KitII+50mm/f1.8+1GBPretecX80/CanonA60+128MB CF... PocketPC=MDA III+1GB SD/Loox600+256MB SD+64MB CF
Doker - 17-03-2006 00:34
Jestem prawie pewien, ze instr przyjmuje twoj tekst jako argument ByVal czyli robi sobie jego lokalna kopie co na marginesie jest głupie ale wersja dla VB.net jest wlasnie taka wiec wnioskuje, ze wersja vb 6 tez taka jest.
W takim razie napewno pomoze, jezeli najpierw podzielisz zrodlo danych na mniejsze kawalki - po jednym rekordzie, a pozniej konkretne dane wydzial z tych podstringow.
Wydaje mi sie, ze lepiej jesli uzyjesz do tego kolekcji niz mialbys wielokrotnie robic Redim Preserve dla tabeli.
Doker - 17-03-2006 00:34
I.. tak! Przepisanie do vb.net daloby znaczny wzrost predkosci Mowie przepisanie, nie skopiowanie.
Skylla - 17-03-2006 00:34
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
> Jestem prawie pewien, ze instr przyjmuje twoj tekst jako argument ByVal czyli > robi sobie jego lokalna kopie co na marginesie jest głupie ale wersja dla > VB.net jest wlasnie taka wiec wnioskuje, ze wersja vb 6 tez taka jest.
W VB6 domyslny jest ByRef :-) S.
BaGRoS - 17-03-2006 00:34
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Doker wrote: > I.. tak! Przepisanie do vb.net daloby znaczny wzrost predkosci > Mowie przepisanie, nie skopiowanie.
Właśnie, jak na razie wczytywanie w .NET jest szybsze ... Myślałem, że jakiś błąd! W VB6 wczytuje się 40 sek, w .NET 0.11 sek...
Nie wiem jak zastąpić VB6: Public KTR As TabKTR
Public Type TabKTR Promocja As String Nazwa As String Cena1 As String Cena2 As String Opis As String Dostepnosc As String Gwarancja As String AdresURL As String KOD As String End Type
i później
With KTR .Promocja... End With
? Nie wiem co powiedzieć na tego .NET'a...
-- BaGRoS / GG#11282 / [at]tlen[dot]pl PC=Athlon64/RAM 1GBTwinMos/HDD 420GB/LiteOn812->832/... FOTO=CanonEOS300D->10D+KitII+50mm/f1.8+1GBPretecX80/CanonA60+128MB CF... PocketPC=MDA III+1GB SD/Loox600+256MB SD+64MB CF
BaGRoS - 17-03-2006 00:34
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
BaGRoS wrote: > Doker wrote: >> I.. tak! Przepisanie do vb.net daloby znaczny wzrost predkosci >> Mowie przepisanie, nie skopiowanie. > > Właśnie, jak na razie wczytywanie w .NET jest szybsze ... > Myślałem, że jakiś błąd! W VB6 wczytuje się 40 sek, w .NET 0.11 sek... > > Nie wiem jak zastąpić > VB6: > Public KTR As TabKTR > > Public Type TabKTR > Promocja As String > Nazwa As String > Cena1 As String > Cena2 As String > Opis As String > Dostepnosc As String > Gwarancja As String > AdresURL As String > KOD As String > End Type > > i później > > With KTR > .Promocja... > End With
Już wiem, że działa tak samo :/ sorki W .NET przejście przez wszystko zajęło 15.65sekundy... (w edytorze) (11597 pozycji) W VB6 przejście przez 100 pozycji zajęło 260sekund... (po kompilacji) jeśli ktoś by się zastanawiał....
-- BaGRoS / GG#11282 / [at]tlen[dot]pl PC=Athlon64/RAM 1GBTwinMos/HDD 420GB/LiteOn812->832/... FOTO=CanonEOS300D->10D+KitII+50mm/f1.8+1GBPretecX80/CanonA60+128MB CF... PocketPC=MDA III+1GB SD/Loox600+256MB SD+64MB CF
Doker - 17-03-2006 00:34
Skylla napisał(a): >> Jestem prawie pewien, ze instr przyjmuje twoj tekst jako argument >> ByVal czyli robi sobie jego lokalna kopie co na marginesie jest głupie >> ale wersja dla VB.net jest wlasnie taka wiec wnioskuje, ze wersja vb 6 >> tez taka jest. > > W VB6 domyslny jest ByRef :-) > S. > a jesli tak to spoko.
Doker - 17-03-2006 00:34
Spoko. Tylko long zastap przez Integer a len(text) przez text.length instr(text, igla) przez text.indexof(igla) pamietajac ze wynik jest 0-indeksowany. Jest szansa, ze nastapi dodatkowy wzrost predkosci.
BaGRoS - 17-03-2006 00:34
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Doker wrote: > Spoko. Tylko long zastap przez Integer > a len(text) przez text.length > instr(text, igla) przez text.indexof(igla) > pamietajac ze wynik jest 0-indeksowany. > Jest szansa, ze nastapi dodatkowy wzrost predkosci.
Następuje :D i dodatkowo idąc za ciosem Mid(CennikTXT, B, A - B)
na
CennikTXT.Substring(B, A - B)
-- BaGRoS / GG#11282 / [at]tlen[dot]pl PC=Athlon64/RAM 1GBTwinMos/HDD 420GB/LiteOn812->832/... FOTO=CanonEOS300D->10D+KitII+50mm/f1.8+1GBPretecX80/CanonA60+128MB CF... PocketPC=MDA III+1GB SD/Loox600+256MB SD+64MB CF
InDesign Scripts - 18-03-2006 01:17
moze najpierw dokonaj paru Replace ... uprosc strukture tego ... i uzywaj Split do wyciagania informacji ... czy to jest w miare usystematyzowana struktura ?? moze dalo by sie z tego za pomoca Split wypelnic TreeView ??
robin
Grzegorz Danowski - 18-03-2006 01:17
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Użytkownik "BaGRoS" <bagros@o2.pl> napisał w wiadomości news:dvc7o9$m9a$1@nemesis.news.tpi.pl... > Cześć! > > Mam takie dane: > "<tr class=o2><td class=atc>J</td><td class=nc>GeForce 6200A Asus 256MB > (64-bit) TV/DVI BOX (AGPx8)</td><td class=c>180</td><td > class=c>178</td><td class=o>wersja BOX, obsługa DirectX 9.0, 128MB pamięci > 64-bit, wyjście DVI i wyjście video (S-video out), nVidia CineFX 3.0m > nVidia Ultra Shadow II</td><td class=n>jest</td><td class=n>36</td><td > class=l2><a > href="http://www.ktr.pl/mapper.php?kod=GRGFX62AS62A256TD64B">4</a></td></tr>" >
A dlaczego nie użyjesz wyrażeń regularnych? Wydaje mi się, że jeśli nawet nie będą działać szybciej (sprawdź), to chociaż utrzymanie kodu będzie prostsze.
Poniżej przykładzik, mam nadzieję, że ci się przyda.
Imports System.Text.RegularExpressions
Module Module1
Sub Main() TestData() Console.ReadLine() End Sub
Public Sub TestData() Dim data As String
data = "<tr class=o2><td class=atc>J</td><td class=nc>GeForce 6200A Asus 256MB " & _ "(64-bit) TV/DVI BOX (AGPx8)</td><td class=c>180</td><td class=c>178</td><td " & _ "class=o>wersja BOX, obsługa DirectX 9.0, 128MB pamięci 64-bit, wyjście DVI i " & _ "wyjście video (S-video out), nVidia CineFX 3.0m nVidia Ultra Shadow " & _ "II</td><td class=n>jest</td><td class=n>36</td><td class=l2><a " & _ "href=""http://www.ktr.pl/mapper.php?kod=GRGFX62AS62A256TD64B"">4</a></td></tr>"
Console.WriteLine("Start: " + DateTime.Now.ToLongTimeString)
For i As Int32 = 1 To 10000 TestRegex(data) Next
Console.WriteLine("End: " + DateTime.Now.ToLongTimeString) End Sub
Public Sub TestRegex(ByVal input As String) Dim reg As Regex Dim pattern As String
pattern = "\<tr\s class=o2\>\<td\sclass\=" & _ "(?<Promocja>[a-z].*?)" & _ "\>.*\<td\s class=nc>" & _ "(?<Nazwa>.*?)" & _ "\</td\>\<td\s class=c\>" & _ "(?<Cena>.*?)" & _ "\</td\>\<td\s class=c\>" & _ "(?<Cena2>.*?)" & _ "\</td\>\<td\s class=o>" & _ "(?<Opis>.*?)" & _ "\</td\>\<td\s class=n>" & _ "(?<Dostepnosc>.*?)" & _ "\</td\>\<td\s class=n>" & _ "(?<Gwarancja>.*?)" & _ "\</td\>\<td\s class=l2>\<a\s href=""" & _ "(?<PoczatekUrl>.*)" & _ "(?<=kod=)(?<kod>.*)" & _ "\""\>4"
reg = New Regex(pattern, RegexOptions.Compiled + _ RegexOptions.IgnorePatternWhitespace)
Dim resultMath As Match = reg.Match(input)
'Console.WriteLine(resultMath.Groups("Promocja").V alue) 'Console.WriteLine(resultMath.Groups("Nazwa").Valu e) 'Console.WriteLine(resultMath.Groups("Cena").Value ) 'Console.WriteLine(resultMath.Groups("Cena2").Valu e) 'Console.WriteLine(resultMath.Groups("Opis").Value ) 'Console.WriteLine(resultMath.Groups("Dostepnosc") .Value) 'Console.WriteLine(resultMath.Groups("Gwarancja"). Value) 'Console.WriteLine(resultMath.Groups("PoczatekUrl" ).Value + _ ' resultMath.Groups("kod").Value) 'Console.WriteLine(resultMath.Groups("kod").Value) End Sub End Module
Pozdrawiam Grzegorz
Grzegorz Danowski - 18-03-2006 01:17
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Użytkownik "Grzegorz Danowski" <gdn__na@serwerze__poczta.onet.pl> napisał w wiadomości news:dve5dr$l8$1@inews.gazeta.pl... (...) > > A dlaczego nie użyjesz wyrażeń regularnych? Wydaje mi się, że jeśli nawet > nie będą działać szybciej (sprawdź), to chociaż utrzymanie kodu będzie > prostsze. > (...) > reg = New Regex(pattern, RegexOptions.Compiled + _ > RegexOptions.IgnorePatternWhitespace) > > Dim resultMath As Match = reg.Match(input) > > End Module >
Jeśli w danych źródłowych masz wiele rekordów, to możesz za pomocą wyrażeń regularnych znaleźć wszystkie modyfikując nieco powyższy kod, np.:
Dim resultMatches As MatchCollection = reg.Matches(input)
For Each resultMatch As Match In resultMatches
Console.WriteLine(resultMatch.Groups("Promocja").V alue) Console.WriteLine(resultMatch.Groups("Nazwa").Valu e) '... itd. Next
lub, co może być bardziej "responsible" (bo w powyższym rozwiązaniu musisz czekać, aż Regex znajdzie wszystkie wystąpienia) skorzystaj z resultMatch.NextMatch, która zwraca kolejne wystąpienie.
Pozdrawiam Grzegor
BaGRoS - 20-03-2006 01:31
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Grzegorz Danowski wrote: > Użytkownik "BaGRoS" <bagros@o2.pl> napisał w wiadomości > news:dvc7o9$m9a$1@nemesis.news.tpi.pl... >> Public Sub TestRegex(ByVal input As String) > Dim reg As Regex > Dim pattern As String
Error 2 Type 'Regex' is not defined. D:\ConsoleApplication1\ConsoleApplication1\Module1 .vb 50 19 ConsoleApplication1
hmm na laptopie śmiga, na stacjonarce nie :|
-- BaGRoS / GG#11282 / [at]tlen[dot]pl PC=Athlon64/RAM 1GBTwinMos/HDD 420GB/LiteOn812->832/... FOTO=CanonEOS300D->10D+KitII+50mm/f1.8+1GBPretecX80/CanonA60+128MB CF... PocketPC=MDA III+1GB SD/Loox600+256MB SD+64MB CF
BaGRoS - 20-03-2006 01:31
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
> Error 2 Type 'Regex' is not defined. > D:\ConsoleApplication1\ConsoleApplication1\Module1 .vb 50 19 > ConsoleApplication1
nie było tematu moja wina :/
-- BaGRoS / GG#11282 / [at]tlen[dot]pl PC=Athlon64/RAM 1GBTwinMos/HDD 420GB/LiteOn812->832/... FOTO=CanonEOS300D->10D+KitII+50mm/f1.8+1GBPretecX80/CanonA60+128MB CF... PocketPC=MDA III+1GB SD/Loox600+256MB SD+64MB CF
BaGRoS - 20-03-2006 01:31
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Grzegorz Danowski wrote: > Użytkownik "BaGRoS" <bagros@o2.pl> napisał w wiadomości > news:dvc7o9$m9a$1@nemesis.news.tpi.pl... >> Cześć! >> >> Mam takie dane: >> "<tr class=o2><td class=atc>J</td><td class=nc>GeForce 6200A Asus >> 256MB (64-bit) TV/DVI BOX (AGPx8)</td><td class=c>180</td><td >> class=c>178</td><td class=o>wersja BOX, obsługa DirectX 9.0, 128MB >> pamięci 64-bit, wyjście DVI i wyjście video (S-video out), nVidia >> CineFX 3.0m nVidia Ultra Shadow II</td><td class=n>jest</td><td >> class=n>36</td><td class=l2><a >> href="http://www.ktr.pl/mapper.php?kod=GRGFX62AS62A256TD64B">4</a></td></tr>" >> > > A dlaczego nie użyjesz wyrażeń regularnych? Wydaje mi się, że jeśli > nawet nie będą działać szybciej (sprawdź), to chociaż utrzymanie kodu > będzie > prostsze. > > Poniżej przykładzik, mam nadzieję, że ci się przyda. > > Imports System.Text.RegularExpressions > > Module Module1 > > Sub Main() > TestData() > Console.ReadLine() > End Sub > > Public Sub TestData() > Dim data As String > > data = "<tr class=o2><td class=atc>J</td><td class=nc>GeForce > 6200A Asus 256MB " & _ > "(64-bit) TV/DVI BOX (AGPx8)</td><td class=c>180</td><td > class=c>178</td><td " & _ > "class=o>wersja BOX, obsługa DirectX 9.0, 128MB pamięci > 64-bit, wyjście DVI i " & _ > "wyjście video (S-video out), nVidia CineFX 3.0m nVidia > Ultra Shadow " & _ > "II</td><td class=n>jest</td><td class=n>36</td><td > class=l2><a " & _ > > "href=""http://www.ktr.pl/mapper.php?kod=GRGFX62AS62A256TD64B"">4</a></td></tr>" > > Console.WriteLine("Start: " + DateTime.Now.ToLongTimeString) > > For i As Int32 = 1 To 10000 > TestRegex(data) > Next > > Console.WriteLine("End: " + DateTime.Now.ToLongTimeString) > End Sub > > Public Sub TestRegex(ByVal input As String) > Dim reg As Regex > Dim pattern As String > > pattern = "\<tr\s class=o2\>\<td\sclass\=" & _ > "(?<Promocja>[a-z].*?)" & _ > "\>.*\<td\s class=nc>" & _ > "(?<Nazwa>.*?)" & _ > "\</td\>\<td\s class=c\>" & _ > "(?<Cena>.*?)" & _ > "\</td\>\<td\s class=c\>" & _ > "(?<Cena2>.*?)" & _ > "\</td\>\<td\s class=o>" & _ > "(?<Opis>.*?)" & _ > "\</td\>\<td\s class=n>" & _ > "(?<Dostepnosc>.*?)" & _ > "\</td\>\<td\s class=n>" & _ > "(?<Gwarancja>.*?)" & _ > "\</td\>\<td\s class=l2>\<a\s href=""" & _ > "(?<PoczatekUrl>.*)" & _ > "(?<=kod=)(?<kod>.*)" & _ > "\""\>4" > > reg = New Regex(pattern, RegexOptions.Compiled + _ > RegexOptions.IgnorePatternWhitespace) > > Dim resultMath As Match = reg.Match(input) > > 'Console.WriteLine(resultMath.Groups("Promocja").V alue) > 'Console.WriteLine(resultMath.Groups("Nazwa").Valu e) > 'Console.WriteLine(resultMath.Groups("Cena").Value ) > 'Console.WriteLine(resultMath.Groups("Cena2").Valu e) > 'Console.WriteLine(resultMath.Groups("Opis").Value ) > 'Console.WriteLine(resultMath.Groups("Dostepnosc") .Value) > 'Console.WriteLine(resultMath.Groups("Gwarancja"). Value) > 'Console.WriteLine(resultMath.Groups("PoczatekUrl" ).Value + _ > ' resultMath.Groups("kod").Value) > 'Console.WriteLine(resultMath.Groups("kod").Value) > End Sub > End Module >
Czas Start: 21:00:27 End: 21:03:51 po kompilacji
moja procedurka po kompilacji 4.72 sekundy (11597 pozycji zamiast 10 000 twoich)
-- BaGRoS / GG#11282 / [at]tlen[dot]pl PC=Athlon64/RAM 1GBTwinMos/HDD 420GB/LiteOn812->832/... FOTO=CanonEOS300D->10D+KitII+50mm/f1.8+1GBPretecX80/CanonA60+128MB CF... PocketPC=MDA III+1GB SD/Loox600+256MB SD+64MB CF
Grzegorz Danowski - 20-03-2006 01:31
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Użytkownik "BaGRoS" <bagros@o2.pl> napisał w wiadomości news:dvkdsk$mqm$1@nemesis.news.tpi.pl... (...) >> A dlaczego nie użyjesz wyrażeń regularnych? Wydaje mi się, że jeśli >> nawet nie będą działać szybciej (sprawdź), to chociaż utrzymanie kodu >> będzie >> prostsze. >> >> Poniżej przykładzik, mam nadzieję, że ci się przyda. (...) > Czas > Start: 21:00:27 > End: 21:03:51 > po kompilacji
Jestem bardzo zaskoczony - na moim laptopie uzyskiwałem czasy poniżej 4 sekund, a tu nagle u ciebie ponad 3 minuty. G.
Grzegorz Danowski - 20-03-2006 01:31
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Użytkownik "Grzegorz Danowski" <gdn__na@serwerze__poczta.onet.pl> napisał w wiadomości news:dvkk1m$p5v$1@inews.gazeta.pl... (...) >>> A dlaczego nie użyjesz wyrażeń regularnych? Wydaje mi się, że jeśli >>> nawet nie będą działać szybciej (sprawdź), to chociaż utrzymanie kodu >>> będzie >>> prostsze. >>> >>> Poniżej przykładzik, mam nadzieję, że ci się przyda. > (...) >> Czas >> Start: 21:00:27 >> End: 21:03:51 >> po kompilacji > > Jestem bardzo zaskoczony - na moim laptopie uzyskiwałem czasy poniżej 4 > sekund, a tu nagle u ciebie ponad 3 minuty.
Zrobiłem jeszcze jeden test: do pliku (InputFile.txt) wrzuciłem 16 tys. rekordów takich jak podałeś w swoim mailu (każdy rekord w osobnym wierszu, bez enterów wewnątrz rekordu) i następnie uruchomiłem następującą procedurę (korzysta z poprzednio podanego kodu):
Public Sub TestDataFromFile() Console.WriteLine("Start: " + DateTime.Now.ToString("mm:ss:ffff"))
Dim myStream As New IO.StreamReader("InputFile.txt") TestRegex(myStream.ReadToEnd())
Console.WriteLine("End: " + DateTime.Now.ToString("mm:ss:ffff")) End Sub
No i te 16 tys. wierszy (prawie 7MB) było przeszukiwane w czasie poniżej 3 sekund. G.
Grzegorz Danowski - 21-03-2006 01:02
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Użytkownik "Grzegorz Danowski" <gdn__na@serwerze__poczta.onet.pl> napisał w wiadomości news:dvknh4$djt$1@inews.gazeta.pl... (...) >>>> A dlaczego nie użyjesz wyrażeń regularnych? Wydaje mi się, że jeśli >>>> nawet nie będą działać szybciej (sprawdź), to chociaż utrzymanie kodu >>>> będzie >>>> prostsze. >>>> >>>> Poniżej przykładzik, mam nadzieję, że ci się przyda. >> (...) >>> Czas >>> Start: 21:00:27 >>> End: 21:03:51 >>> po kompilacji >> >> Jestem bardzo zaskoczony - na moim laptopie uzyskiwałem czasy poniżej 4 >> sekund, a tu nagle u ciebie ponad 3 minuty. > > Zrobiłem jeszcze jeden test:
Nieco zmodyfikowane oba testy (string i plik) można ściągnąć stąd: http://www.gdnkonsulting.waw.pl/Down...styRegesVB.zip
Jeśli ktoś ma chwilkę czasu, to proszę o podanie osiąganych czasów. Tak jak pisałem wcześniej, u mnie na laptopie stary Celeron 2k, 512 MB RAM, wiele aplikacji uruchomionych w tle, oba testy wykonują się poniżej 3 sekund.
Zmieniłem też troszkę samo wyrażenie regularne (po wyrzuceniu opcji RegexOptions.IgnorePatternWhitespace mogłem usunąć \s, co utrudniało jego zrozumienia).
Pozdrawiam Grzegorz
BaGRoS - 22-03-2006 00:08
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Grzegorz Danowski wrote: > Użytkownik "BaGRoS" <bagros@o2.pl> napisał w wiadomości > news:dvkdsk$mqm$1@nemesis.news.tpi.pl... > (...) >>> A dlaczego nie użyjesz wyrażeń regularnych? Wydaje mi się, że jeśli >>> nawet nie będą działać szybciej (sprawdź), to chociaż utrzymanie >>> kodu będzie >>> prostsze. >>> >>> Poniżej przykładzik, mam nadzieję, że ci się przyda. > (...) >> Czas >> Start: 21:00:27 >> End: 21:03:51 >> po kompilacji > > Jestem bardzo zaskoczony - na moim laptopie uzyskiwałem czasy poniżej > 4 sekund, a tu nagle u ciebie ponad 3 minuty. > G.
teraz: [1] test odczytu z pliku [2] test stringu [0] koniec 1 Start: 45:59:2783 Liczba znalezionych rekordów: 16384 GeForce 6200A Asus 256MB (64-bit) TV/DVI BOX (AGPx8) End: 46:00:3096
[1] test odczytu z pliku [2] test stringu [0] koniec 2 Start: 46:01:7783 GeForce 6200A Asus 256MB (64-bit) TV/DVI BOX (AGPx8) End: 46:02:4033
[1] test odczytu z pliku [2] test stringu [0] koniec
nie wiem dlaczego tak długo wcześniej...
-- BaGRoS / GG#11282 / [at]tlen[dot]pl PC=Athlon64/RAM 1GBTwinMos/HDD 420GB/LiteOn812->832/... FOTO=CanonEOS300D->10D+KitII+50mm/f1.8+1GBPretecX80/CanonA60+128MB CF... PocketPC=MDA III+1GB SD/Loox600+256MB SD+64MB CF
BaGRoS - 22-03-2006 00:08
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Grzegorz Danowski wrote: > Użytkownik "Grzegorz Danowski" <gdn__na@serwerze__poczta.onet.pl> > napisał w wiadomości news:dvknh4$djt$1@inews.gazeta.pl... > (...) >>>>> A dlaczego nie użyjesz wyrażeń regularnych? Wydaje mi się, że >>>>> jeśli nawet nie będą działać szybciej (sprawdź), to chociaż >>>>> utrzymanie kodu będzie >>>>> prostsze. >>>>> >>>>> Poniżej przykładzik, mam nadzieję, że ci się przyda. >>> (...) >>>> Czas >>>> Start: 21:00:27 >>>> End: 21:03:51 >>>> po kompilacji >>> >>> Jestem bardzo zaskoczony - na moim laptopie uzyskiwałem czasy >>> poniżej 4 sekund, a tu nagle u ciebie ponad 3 minuty. >> >> Zrobiłem jeszcze jeden test: > > Nieco zmodyfikowane oba testy (string i plik) można ściągnąć stąd: > http://www.gdnkonsulting.waw.pl/Down...styRegesVB.zip
Nie mogę tego wczytać do Microsoft Visual Studio 2005 Version 8.0.50727.42 (RTM.050727-4200) Microsoft .NET Framework Version 2.0.50727
Installed Edition: VB Express
.... :(
-- BaGRoS / GG#11282 / [at]tlen[dot]pl PC=Athlon64/RAM 1GBTwinMos/HDD 420GB/LiteOn812->832/... FOTO=CanonEOS300D->10D+KitII+50mm/f1.8+1GBPretecX80/CanonA60+128MB CF... PocketPC=MDA III+1GB SD/Loox600+256MB SD+64MB CF
Grzegorz Danowski - 22-03-2006 00:08
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Użytkownik "BaGRoS" <bagros@o2.pl> napisał w wiadomości news:dvpiie$885$1@atlantis.news.tpi.pl... (...) >> >> Nieco zmodyfikowane oba testy (string i plik) można ściągnąć stąd: >> http://www.gdnkonsulting.waw.pl/Down...styRegesVB.zip > > Nie mogę tego wczytać do > Microsoft Visual Studio 2005 > Version 8.0.50727.42 (RTM.050727-4200) > Microsoft .NET Framework > Version 2.0.50727 > > Installed Edition: VB Express >
Niestety nie mam VB Express, więc nie mogę tego sprawdzić. Proponuję byś otworzył notatnikiem plik Module1.vb, skopiował całą zawartość i wkleił do nowej aplikacji konsolowej VB.NET 2005. Może to wystarczy, a może nie - spróbuj :-). A swoją drogą to dziwne, że VB Express nie czyta aplikacji VB.NET 2003 - jak próbowałem zrobić coś podobnego w C# Expressie to mi się udało i to w przypadku dużo bardziej skomplikowanej aplikacji.
Pozdrawiam Grzegorz
BaGRoS - 22-03-2006 00:08
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Grzegorz Danowski wrote: > Użytkownik "BaGRoS" <bagros@o2.pl> napisał w wiadomości > news:dvpiie$885$1@atlantis.news.tpi.pl... > (...) >>> >>> Nieco zmodyfikowane oba testy (string i plik) można ściągnąć stąd: >>> http://www.gdnkonsulting.waw.pl/Down...styRegesVB.zip >> >> Nie mogę tego wczytać do >> Microsoft Visual Studio 2005 >> Version 8.0.50727.42 (RTM.050727-4200) >> Microsoft .NET Framework >> Version 2.0.50727 >> >> Installed Edition: VB Express >> > > Niestety nie mam VB Express, więc nie mogę tego sprawdzić. Proponuję > byś otworzył notatnikiem plik Module1.vb, skopiował całą zawartość i > wkleił do nowej aplikacji konsolowej VB.NET 2005. Może to wystarczy, > a może nie - spróbuj :-). A swoją drogą to dziwne, że VB Express nie > czyta aplikacji VB.NET 2003 - jak próbowałem zrobić coś podobnego w > C# Expressie to mi się udało i to w przypadku dużo bardziej > skomplikowanej aplikacji.
Mogę tak wkleić, lecz działa wolno... Jak opisałem.
-- BaGRoS / GG#11282 / [at]tlen[dot]pl PC=Athlon64/RAM 1GBTwinMos/HDD 420GB/LiteOn812->832/... FOTO=CanonEOS300D->10D+KitII+50mm/f1.8+1GBPretecX80/CanonA60+128MB CF... PocketPC=MDA III+1GB SD/Loox600+256MB SD+64MB CF
Grzegorz Danowski - 22-03-2006 00:08
=?iso-8859-2?Q?Re:_=5BVB6=5D_D=A3UGIE_optymalizacja...?=
Użytkownik "BaGRoS" <bagros@o2.pl> napisał w wiadomości news:dvplpr$8jq$1@nemesis.news.tpi.pl... >> Proponuję >> byś otworzył notatnikiem plik Module1.vb, skopiował całą zawartość i >> wkleił do nowej aplikacji konsolowej VB.NET 2005. Może to wystarczy, >> a może nie - spróbuj :-). A swoją drogą to dziwne, że VB Express nie >> czyta aplikacji VB.NET 2003 - jak próbowałem zrobić coś podobnego w >> C# Expressie to mi się udało i to w przypadku dużo bardziej >> skomplikowanej aplikacji. > > Mogę tak wkleić, lecz działa wolno... Jak opisałem. >
A więc miejmy nadzieję, że odezwie się jakiś ekspert od VB.NET 2005 i wyjaśni dlaczego tak się dzieje. Ja zrobiłem wersję w C# Express (do pobrania: http://www.gdnkonsulting.waw.pl/Down.../TestRegex.zip) i ta działa równie szybko jak wersja w VB.NET 2003 (jeśli nie szybciej).
Pozdrawiam Grzegorz
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Wydajność baz danych w zależności od poziomu izolacji ANSI/ISO
Czy zna (obsługuje) ktoś program Iso Draw ?
MYSQL - kodowanie w ISO-PL
strona plus baza w iso do utf-8
Kodowanie: z iso na utf
Konwesja znaków w dump'ie bazy danych - ISO -> utf-8 -> ISO -> utf-8
=?iso-8859-2?q?Co_oznacza_b=B3=B1d_Warning:_mysql=5Fconnect() _[function.mysql-connect]:_Can't_connect_to_local_MySQL_server_through_sock et_'/var/run/mysqld/mysqld.sock'_(2)_in?=
=?iso-8859-2?q?Informatyka,_Java,_EJB,_Ajax,_Spring=2E_Czy=BF by_to_koniec_=B6wiata,_czy_te=BF_nasze_uczelnie_b= EAd=B1_uczy=B3y_w_ko=F1cu!_czego_praktycznego_=2E= 2E=2E=2E?=
=?iso-8859-2?q?Ati_Mobility_Radeon_X300_W_Notebooku_Jak_Zwi=E Akszy=E6_Ilo=B6=E6_Grafiki_Poprzez_Wsp=F3=B3dziele nie_Z_Ramu=3F=3F=3F?=
=?ISO-8859-2?Q?=AFegnam_si=EA=2E=2E=2E?=
zanotowane.pldoc.pisz.plpdf.pisz.pltejsza.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|