CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [BCB C++] Liczenie lini \r\n danych z dużych pliku

[BCB C++] Liczenie lini \r\n danych z dużych pliku

dział ogólny

Re: [BCB C++] Liczenie lini \r\n danych z dużych pliku

Nowy postprzez Darek_C++ » wtorek, 4 września 2012, 21:20

Nie mam niby release tylko mam release.
Po zamianie
delete hList;
end = clock();

Wyniki jakie mam
512610 Czas: 0.469000
512610 Czas: 0.437000
512610 Czas: 0.438000

Ustawienia kompilatora są pzrecież takie same, bo to jest z jednego programu.
Wiec nadal różnica czasu między tymi metodami jest kolosalna, ale nie miej do mnie o to pretensji :roll:
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] Liczenie lini \r\n danych z dużych pliku

Nowy postprzez polymorphism » wtorek, 4 września 2012, 21:33

Tu masz wersję release:
test_console.zip

wywołanie: test_console.exe <nazwa pliku do przeliczenia>

Ustawienia kompilatora są pzrecież takie same, bo to jest z jednego programu.
Wiec nadal różnica czasu między tymi metodami jest kolosalna

To nic, że jest z jednego programu. Tutaj pisałem dlaczego -> viewtopic.php?p=12937#p12937
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] Liczenie lini \r\n danych z dużych pliku

Nowy postprzez Darek_C++ » wtorek, 4 września 2012, 21:55

Twój program wykonuje to w:
n = 512607 t = 140
Jedak nadal jest różnica w liczbie linnii z tym co pokazuje EditPlus 512608.
Ja kompiluje program też w trybie Release i mam takie wyniki Twojego kodu jakie mam co jest tym bardziej dziwne.
---
Też bym się chętnie dowiedział dlaczego mam taką różnicę w czasie wykonywania między Twoim, a moim programem :(
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] Liczenie lini \r\n danych z dużych pliku

Nowy postprzez polymorphism » wtorek, 4 września 2012, 22:05

Brak jednej linii wynika zapewne z tego, że ostatnia linia w pliku nie jest zakończona znakiem końca linii (co jest generalnie błędem).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] Liczenie lini \r\n danych z dużych pliku

Nowy postprzez Cyfrowy Baron » środa, 5 września 2012, 09:57

Mnie też te pomiary wykonane Darek_C++ wydają jakieś nierealne. Po pierwsze różnice są zbyt duże, po wtóre czasy wczytywania pliku o rozmiarze 7,42 MB są za wysokie, u mnie plik o rozmiarze 7.55 MB i liczbie linii 124172 kodowany w ANSI jest wczytywany z wykorzystaniem THashedStringList = 0.047 ms; ifstream (mój kod) = 0.125 ms; ifstream (kod polymorphism) = 0.031 ms i linie są liczone prawidłowo. Jak widać po zmodyfikowaniu kod podany przez polymorphism jest nieznacznie szybszy od THashedStringList zarówno w przypadku plików kodowanych w ANSI jak i Unicode.

Może masz jakieś problemy z dyskiem twardym. Sprawdź w menadżerze urządzeń, czy chodzi ci w trybie Ultra DMA 5, czy twój dysk chodzi na kontrolerze ATA, czy SATA?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] Liczenie lini \r\n danych z dużych pliku

Nowy postprzez Darek_C++ » środa, 5 września 2012, 10:17

Cyfrowy Baron napisał(a):Może masz jakieś problemy z dyskiem twardym. Sprawdź w menadżerze urządzeń, czy chodzi ci w trybie Ultra DMA 5, czy twój dysk chodzi na kontrolerze ATA, czy SATA?
Przecież w metodzie z THashedStringList która u mnie wykonuje się bardzo szybko też musi nastąpić odczyt z dysku, wiec to nie to. SATA > TAK. Przy czasie będę jeszcze raz sprawdzał...
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] Liczenie lini \r\n danych z dużych pliku

Nowy postprzez Cyfrowy Baron » środa, 5 września 2012, 10:22

Te różnice jak sam widzisz są jednak bardzo duże, więc coś jest nie tak z tymi pomiarami.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] Liczenie lini \r\n danych z dużych pliku

Nowy postprzez Cyfrowy Baron » środa, 5 września 2012, 10:30

Sprawdź czy dyski pracują ci w trybie UDMA. Microsoft w poprawce ServicePack 2 dodał do systemu nową funkcją, która w przypadku wystąpienia łącznie 6 błędów przekroczenia limitu czasu i CRC system przestawia dysk w wolniejszy tryb pracy, z reguły w PIO. W SP3 ten błąd naprawiono i łącznie 6 błędów zamieniono na 6 kolejnych błędów, tyle tylko, że domyślnie to ta funkcja w SP3 jest wyłączona i system dalej pracuje tak jak w SP2. Ja miałem to u siebie kilkakrotnie, że dysk przechodził mi w tryb PIO, ale w końcu zmodyfikowałem rejestr i tak by przestawianie dysku w tryb wolniejszy następowało tylko jeśli wystąpi 6 kolejnych błędów.

Nie sądzę jednak by dysk pracował u ciebie w PIO, gdyż od razu byś to zauważył.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] Liczenie lini \r\n danych z dużych pliku

Nowy postprzez Darek_C++ » środa, 5 września 2012, 10:40

W załączniku dodałem mój program testowy z kodem źródłowym. Możecie zobaczyć czy u Was też taka różnica jest :(
---
Testowałem na innym kompie cienkim VPS tylko na mniejszym pliku 6.8 MB i wyniki są takie:
ifstream
248898 Czas: 1.469000
248898 Czas: 0.609000
248898 Czas: 0.594000
----
THashedStringList
248898 Czas: 0.063000
248898 Czas: 0.063000
248898 Czas: 0.063000

z plikiem 13,7 MB
ifstream
497797 Czas: 1.297000
497797 Czas: 1.187000
---
THashedStringList
497797 Czas: 0.141000
497797 Czas: 0.125000

Może mam błąd w tym programie
KOD cpp:     UKRYJ  
void __fastcall TForm4::Button1Click(TObject *Sender)
{
        if(OpenTextFileDialog1->Execute())
        {
                 clock_t start, end;
                 start = clock();
                 char Buf[255];

                String plik = OpenTextFileDialog1->FileName;

                ifstream ifs(plik.c_str(), ios::binary);

                size_t n = 0;
                char data[4096];
                size_t c;

                while((c = ifs.read(data, sizeof(data)).gcount()) > 0)
                {
                        for(size_t i = 0; i < c; ++i)
                                                if(data[i] == '\n') ++n;
                }
                end = clock();
                sprintf(Buf, "%f", (end - start) / CLK_TCK);
                Memo1->Lines->Add((String) n +" Czas: "+ (String)Buf);

        }
}
:roll:
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Ostatnio edytowano środa, 5 września 2012, 10:51 przez Darek_C++, łącznie edytowano 1 raz
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] Liczenie lini \r\n danych z dużych pliku

Nowy postprzez Cyfrowy Baron » środa, 5 września 2012, 10:51

Twój program. Plik 7,5 MB; 62084 linii 124168

ifstream = 0.406 ms
THashedStringList = 0.031 ms

Którego kodu użyłeś dla ifstream?

Różnice są rzeczywiście nierealnie duże. Wychodzi na to, że to wina bibliotek w środowisku TEC++, lub sposobu optymalizacji kodu przez to dość już stare środowisko.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] Liczenie lini \r\n danych z dużych pliku

Nowy postprzez Darek_C++ » środa, 5 września 2012, 10:52

Cyfrowy Baron napisał(a):Którego kodu użyłeś dla ifstream?.
Tego wyżej zamieszczonego -jest w kodzie źródłowym programu. Kompilacja Release_Build
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] Liczenie lini \r\n danych z dużych pliku

Nowy postprzez Cyfrowy Baron » środa, 5 września 2012, 11:04

Czyli to wina środowiska TEC++.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] Liczenie lini \r\n danych z dużych pliku

Nowy postprzez Slynx » niedziela, 9 września 2012, 22:34

Zrobiłem małe porównanie. Za pomocą programu "Zliczanie linii" z załącznika i własnych kompilacji pod c++ oraz C# dla 2 różnych plików. Przy okazji mamy porównanie kompilatorów, jak radzą sobie z takim kodem, bcb i microsftowy.
Na początek, kody których użyłem (C++):
KOD cpp:     UKRYJ  
clock_t start, end;
start = clock();
ifstream ifs;

ifs.open ("d:\\file.txt", ifstream::binary);

size_t c;
char data[4096];
size_t n = 0;

while ((c = ifs.read(data, sizeof(data)).gcount()) > 0)
{
        for(size_t i = 0; i < c; ++i)
                if(data[i] == '\n') ++n;
}

ifs.close();
end = clock();
std::cout << "Time: " << (end - start) ;
 

(C# console application + .NET framework 4.0)
KOD csharp:     UKRYJ  
int b;
int counter = 0;
var st = new Stopwatch();

var buffer = new byte[4096];

var sr = new FileStream("d:\\file.txt", FileMode.Open, FileAccess.Read, FileShare.None, 4096, FileOptions.SequentialScan);
st.Start();
while ((b = sr.Read(buffer, 0, buffer.Length)) > 0)
    for (int i = 0; i < b; i++)
        if (buffer[i] == '\n')
            ++counter;
st.Stop();
Console.WriteLine(counter + " time " + st.ElapsedMilliseconds);
 


Wyniki:
Plik 15 MB/150 tys linii
BCB
ifStream | THashedStringList

2.013000 0.140000
1.965000 0.140000
1.950000 0.140000
1.950000 0.140000

MS
C++ | C#
33 ms 127 ms
27 ms 88 ms
26 ms 90 ms
31 ms 88 ms

Plik 300 MB / 3 mln linii
BCB
ifStream | THashedStringList
38.751000 2.902000
38.829000 2.652000
39.016000 2.636000
38.797000 2.605000

MS
C++ | C#
576 ms 1658 ms
576 ms 1721 ms
538 ms 1703 ms
521 ms 1695 ms

Różnica jest jak widać spora. W przypadku przykładu polymorphism(a) wąskim gardłem okazuje się przeliczanie. Dysk przez te 40 sekund praktycznie nie pracował, a procesor wisiał cały czas na 100 %.
THashedStringList, którego odpowiednikiem w C# jest HashSet jak widać jest bardzo szybki. W przypadku MS widać, że biblioteki .NET - w tym przypadku StreamReader jest znacznie wolniejszy mimo, że to tak na prawdę to samo, ale "przyjazność" klas ma swoją cenę.
W obydwu przypadkach programy kompilowane pod Release z maksymalnymi optymalizacjami.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: [BCB C++] Liczenie lini \r\n danych z dużych pliku

Nowy postprzez polymorphism » poniedziałek, 10 września 2012, 11:32

Jestem ciekaw, co powoduje te opóźnienia w ifstream z Buildera. Różnice w czasach są zbyt duże, żeby mówić jedynie o różnicach w implementacji strumienia. Trzeba by użyć jakiegoś profilera...
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] Liczenie lini \r\n danych z dużych pliku

Nowy postprzez Slynx » poniedziałek, 10 września 2012, 15:41

Kompilatora bcb nie mam, dlatego Ci nie powiem, ale stawiam na wewnętrzny bufor. Jak masz kod, to dopisz coś takiego
Kod: Zaznacz cały
char Buffer[65536];
ifs.open ("d:\\file.txt", ifstream::binary);
ifs.rdbuf()->pubsetbuf(Buffer, 65536); // 64 KB

i spróbuj wtedy na jakimś dużym pliku (300 MB ?). Jeśli nic nie jest zmieniane/optymalizowane to przy tak dużym pliku powinien być znaczny wzrost.
(U mnie przy buforze 256 KB zszedł z 500 ms do 250).
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 26 gości

cron