🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

5 total messages Started by DMR Mon, 28 Jan 2019 16:24
strtod()
#309810
Author: DMR
Date: Mon, 28 Jan 2019 16:24
17 lines
2712 bytes
K... :-(

Mam zassany do pamięci plik tekstowy (~3 MB), zadanie polega na tym, żeby znaleźć w tym buforze określone wartości (zmiennoprzecinkowe), przeliczyć, PODMIENIĆ (tak się szczęśliwie składa, że wynikowe sekwencje znaków są krótsze), zapisać ten blok do pliku i święto wiosny.

Samo się narzuca użycie do "sparsowania" danych stworzonej do takich celów funkcji strtod().
Wszystko jasne, jak pomyślałem, tak zrobiłem - ale po odpaleniu programu... zwiecha, wentylator wyje, i7 zarżnięty na 100%...
Siłowe zarżnięcie pętli na 1000 linii daje zawrotny czas wykonania programu równy prawie 2.5 sekundy. Krótsze pliki liczyły się poprawnie, ale pół sekundy na przetworzenie 200 linii... Coś tu nie gra.
Kombinowałem wielorako, nawet podmieniłem to na sscanf() - to samo.
W końcu coś mnie tknęło i przed parsowaniem popodmieniałem w buforze znaki za wczytywanymi wartościami zerami - wszystko ruszyło, jak trzeba!
No i już widać w czym problem...

Funkcja strtod() za każdym razem poprawnie zwracała endptr, więc ja się pytam - po jaką cholerę gmera ona jeszcze coś w buforze za tym znakiem? Końcowe zero nie jest jej przecież do niczego potrzebne. Przy sscanf() jeszcze jest to zrozumiałe, ale tu?

No i co ja mam teraz zrobić? :-(

Jest gdzieś dostępne źródło TEJ funkcji, żeby sobie nanieść poprawki?
Działam na C::B + MinGW
Re: strtod()
#309811
Author: szykcech
Date: Mon, 28 Jan 2019 16:39
1 lines
1381 bytes
Do przetwarzania prostych plików tekstowych tylko RegExp, do języków parsery języków (jak sama nazwa wskazuje)...
Re: strtod()
#309812
Author: DMR
Date: Mon, 28 Jan 2019 17:06
1 lines
1327 bytes
Nie tylko.
Re: strtod()
#309813
Author: DMR
Date: Mon, 28 Jan 2019 18:22
7 lines
1779 bytes
> No i co ja mam teraz zrobić?


A sam se taką funkcję napiszę!

Właściwie już napisałem - po stablicowaniu potęg dziesiątki śmiga 3x szybciej od atof(), a to jeszcze nie jest ostatnie słowo!
Przecież dla liczb typu 8888888888.8888888888 można skorzystać z int-ów i dopiero na końcu przekształcić do doubla! :-)
Re: strtod()
#309814
Author: DMR
Date: Mon, 28 Jan 2019 19:10
10 lines
1486 bytes
> a to jeszcze nie jest ostatnie słowo!


10 000 000 wywołań:

atof() - 0.43 s
moja - 0.05 s


Dziękuję za uwagę! :-)
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads