Wpis z mikrobloga

#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?
  • 18
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@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.
  • Odpowiedz
@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).
  • Odpowiedz
@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ć.
  • Odpowiedz
@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.
  • Odpowiedz
@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:
  • Odpowiedz
@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:
  • Odpowiedz