Optymalizacja parsowanie w C++ Bulider

0

Witam,

Pisze program, którego jednym z zadań jest parsowanie pewnego pliku tekstowego zapisanego na dysku...

Kod wygląda następująco:

Form1->Memo1->Lines->LoadFromFile(file_n);
s=Memo1->Lines->Text;

sms[i].status=s.SubString(s.AnsiPos("M E S S A G E - T Y P E")+26, (s.AnsiPos(" B E G I N : V C A R D")-s.AnsiPos("M E S S A G E - T Y P E"))-29);

Form1->Memo3->Lines->Add(sms[i].status);

Poza typem sms'a program wyłapuje numer, datę, tekst. Problem tkwi w tym, iż program działa bardzo wolno i dla np: 100 wiadomości parsowanie trwa ok. 1min co mnie nie satysfakcjonuje.

Moje pytanie brzmi następująco: Jak zoptymalizować mój kod? I jaka operacja zabiera najwięcej czasu?

Pozdrawiam i dziękuję za wszelką pomoc;)

0

Szukanie. Użyj regexpów bo są przeznaczone do takich rzeczy i z reguły od razu plują wynikami.

0

@up - od kiedy regexpy są szybkie? No chyba że chodzi o to żeby wszystko na raz wczytać to być może...

0

No na pewno szybsze niż 3-krotne szukanie przez całą tablicę.

0

A moim zdaniem powinien przejrzeć API TStrings (wartość Memo1->Lines).
Cały problem polega na tym, że twój kod wykonuje za dużo niepotrzebnych konwersji między typami i to właśnie dlatego jest tak powolny.
Popatrz co potrafi TStrings, albo posłuż się czymś prostszym.
Poza tym z tego co pamiętam w C++ Builder istnieje specjalna (nieudokumentowana) klasa do parsowania tekstu.

0

Co do wyrażeń regularnych to raczej mi się nie przydadzą, bo potrzebuje czegoś co mi poda pozycje wyrażenia w stringu, a następnie przesunie karetkę o n pozycji i odczyta substringa.

0

Może zacznijmy od tego: od kiedy regexpy są w bcb

0

Tak sobie myślę, że można by wrzucić do kodu c, wstawkę z innego języka, przeznaczonego do parsowania. Czy istnieje taka możliwość? Jaki inny język zastosować? A może zrezygnować z C++ na rzecz bardziej wydajnego języka?

0

Sensownego wydajniejszego języka nie ma. Szybkość to kwestia algorytmów jakie zastosujesz.

0

A może zrezygnować z C++ na rzecz bardziej wydajnego języka?
W jaki sposób „wydajniejszego”? Bo w sensie wydajności generowanego kodu to właśnie C++ — ściślej: kompilatory C++ — przodują. Są kompilatory pod tym względem lepsze (Intel C++ compiler) i gorsze (MinGW), ale ogólnie szybszego od C i C++ języka po prostu nie ma.

0

Jak już pisałem, to nie problem języka, ale źle wykorzystanej biblioteki (za dużo, ciężkich automatycznych konwersji).
Jeszcze raz powtarzam, przejrzyj API TStrings tam znajdziesz coś do skutecznego przeszukania tekstu, względnie posłuż się czymś prostszym jak fstream, atof, atoi itp itd.

0
MarekR22 napisał(a)

Jak już pisałem, to nie problem języka, ale źle wykorzystanej biblioteki (za dużo, ciężkich automatycznych konwersji).
Jeszcze raz powtarzam, przejrzyj API TStrings tam znajdziesz coś do skutecznego przeszukania tekstu, względnie posłuż się czymś prostszym jak fstream, atof, atoi itp itd.

Dzięki MarekR22, zamieniłem AsciiPos na zwykłe Pos z TStrings i pomogło, algorytm jest o 10x szybszy:)

Tak BTW:
Narodziło mi się kilka pytań, mianowicie czym się różni zwykły string od TString, oraz czym się różni funkcja AsciiPos od Pos?

Pozdrawiam i jeszcze raz dziękuję za pomoc:)

0
othello napisał(a)

Może zacznijmy od tego: od kiedy regexpy są w bcb

a skanczmy na tym: dlaczego mialoby ich nie byc? :>

witek23 napisał(a)

Tak BTW:
Narodziło mi się kilka pytań, mianowicie czym się różni zwykły string od TString, oraz czym się różni funkcja AsciiPos od Pos?

tym, ze sa niezwykle ;) poczytaj w dokumentacji, przeciez to nie czasy BBS'ow

0
Passagee napisał(a)

tym, ze sa niezwykle ;) poczytaj w dokumentacji, przeciez to nie czasy BBS'ow

Z tego co wyczytałem to TString to klasa wirtualna, która przedstawia ciąg znaków za pomocą wektora. Ale jednej rzeczy nie rozumiem, jak TString to wektor, wektor ten musi składać się z liczb odpowiadających danym literą. To w takim razie czym się on różni od ciągu ASCII String, który zgodnie z nazwą powinien składać się z kodów ASCII.

0

strzelam: obsługą Unicode? ostatecznie, skoro ta druga nazywa sie ASCII-blah, to jak dla mnie to implikuje dokladnie wszystko.. btw. co rozumiesz przez "klasa wirtualna"?

1 użytkowników online, w tym zalogowanych: 0, gości: 1