Khaine
#programowanie #qt #cpp

Pytanie do programistów Qt i w sumie nie tylko.

Potrzebujemy w Qt pojemnika do przechowywania dużych ilości próbek typu double. Mówimy tutaj o ilościach próbek przekraczających nawet 4 miliony.

Logika podpowiada, że najlepszy byłby QVector. Bo czym jest QVector? Tablicą z ficzerami. Powinien być pomijalnie wolniejszy i zajmować pomijalnie więcej. Test dla 3kk próbek na prealokowanej pamięci pokazał natomiast, że QVector zajął w pamięci programu 1/3 więcej, zapis do niego był ponad 5x wolniejszy i odczyt z niego był 2,5 krotnie wolniejszy. W porównaniu do zwykłego arraya oczywiście.

To jest w ogóle możliwe, żeby on wypadł tak bardzo źle? Wkradł się jakiś element losowy związany np. ze schedulerem OSu?
  • Najlepsze
  • Wszystkie komentarze
kalectwo
@Khaine: wszystkie kontenery Qt można sobie o dupę rozbić, używaj stl'a
Potekk
Potekk
@Khaine: próbowałes wykonać "reserve" przed pierwszym użyciem?
kalectwo
@Khaine: tak to się robi, taką ilością próbek rozsadzisz system
dupasmoka
@Khaine: pokaż kod, bo może źle używasz. Np.

For read-only access, an alternative syntax is to use at():

at() can be faster than operator[](), because it never causes a deep copy to occur.

i być może bardziej odpowiednią strukturą będzie QVarLengthArray.
AtakObcych
@kalectwo: czysty OpenGL (⌐ ͡■ ͜ʖ ͡■)
g.....i
@kalectwo: popieram!
Khaine
Khaine Autor
0
@kalectwo: A orientujesz się czy QCustomPlot przyjmie jako argument std::vector? Bo coś kurde pamiętam, że wymuszał na mnie QVector jak ostatni raz używałem. Oczywiście, że QCustomPlot się zesra przy 3kk próbek, ale pytanie czy w ogóle się da mu zapakować jako argument. Bo to, że próbki trzeba będzie wybierać to inna kwestia.
kalectwo
@Khaine: wszystko od qt woła ich implementacji, będziesz musiał ręcznie kopiować.
ale i tak raczej nie wrzucałbyś milionów próbek w wykres?
Khaine
Khaine Autor
0
@kalectwo: No napisałem, że nie ma szans. Więc teraz pytanie brzmi jaki jest górny limit QCustomPlota. Bo prawdopodobnie będzie tak, że próbki trzymane masowo w zwykłym arrayu albo std::vector będę musiał jakoś wybierać i np. przerzucać do QVectora gdzie będzie ich o wiele mniej i czas nie będzie taki istotny w porównaniu do mielenia tych próbek (np. aby brał medianę z każdych kolejnych xx próbek czy cokolwiek).
Khaine
Khaine Autor
0
@kalectwo: No oczywiście, że rozsadzę :D To jest wykluczone aby jakikolwiek plotter mi to ogarnął. Poza tym na ekranie nie masz takiej rozdzielczości aby to nawet zobaczyć.
Khaine
Khaine Autor
0
@dupasmoka: @kalectwo:

Ciekawostka:

Containers tests BEGIN. Number of samples: 3000000 , iterations: 10
"Array"
Khaine
Khaine Autor
0
@dupasmoka: @Potekk: @kalectwo:

Teraz mnie dziwi ile szybsze są QVectory i QArraye od ich pierwowzoru. Jak to jest możliwe w ogóle?
kalectwo
@Khaine: coś wątpię by był lepszy od c array, chyba poknociłeś coś ( ͡° ͜ʖ ͡°)
Khaine
Khaine Autor
0
@kalectwo:

No wychodzi tak ciągle.
Khaine
Khaine Autor
0
@kalectwo: Tamto było na słabym lapku kumpla, na moim kompie jest tak samo:

Containers tests BEGIN. Number of samples: 10000000 , iterations: 10
"Array" WorkingSetSize used: 157 MB
"Array" PageFile used: 154 MB
"Array" creationTime:
dupasmoka
@Khaine: wrzucisz kod testów?
Khaine
Khaine Autor
0
@dupasmoka:

https://www.sendspace.com/file/5wfggd

Jak masz Qt 5.5.1 64 bit i Visual Studio 2013 z kompilatorem MSVC 12.0 amd64, to możesz odpalić z marszu cały projekt.
Khaine
Khaine Autor
0
@dupasmoka: Znalazłem już error. Przy kopiowaniu ktoś coś zwalił i zamiast += było =. To są wyniki wiarygodne:

Containers tests BEGIN. Number of samples: 10000000 , iterations: 40
"Array" WorkingSetSize used: 157 MB
"Array" PageFile used: 154 MB
"Array" creationTime: