Repository navigation
v1.5 release
Pre-releasev1.5
Diegimo instrukcija
- Atsisiųskite projekto kodą iš GitHub naudodami
git clonekomandą su projekto URL:
git clone https://github.com/nojusta/LabDarbas_nr2
- Pereikite į projekto katalogą naudodami cd komandą. Pavyzdžiui:
cd *projekto vieta kompiuteryje*
- Sukurkite Makefile su reikiamomis taisyklėmis. Jūsų Makefile turėtų atrodyti maždaug taip (Unix OS atveju):
# Kompiliatorius
CXX = g++
# Kompiliatoriaus parametrai
CXXFLAGS = -std=c++14 -O3
# Vykdymo failo pavadinimas
TARGET = v1_5
# Šaltinio failai
SRCS = main.cpp functionality.cpp input.cpp calculations.cpp student.cpp
# Objektų failai
OBJS = $(SRCS:.cpp=.o)
# Taisyklė programa susieti
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS)
# Taisyklė kompiliuoti šaltinio failus
.cpp.o:
$(CXX) $(CXXFLAGS) -c $< -o $@
# Taisyklė išvalyti tarpinius failus
clean:
$(RM) $(OBJS)
# Taisyklė išvalyti viską
distclean: clean
$(RM) $(TARGET)- Sukompiliuokite programą naudodami make komandą:
make
Tada gausite tokį rezultatą:
- Paleiskite programą naudodami šią komandą:
./v1
Valymo instrukcija
- Jei norite išvalyti sukompiliuotus failus, galite naudoti šias make komandas:
make clean
make distclean
Naudojimosi instrukcija
- Paleiskite programą naudodami šią komandą:
./v1_5
- Programa pateiks meniu su įvairiomis funkcijomis. Pasirinkite funkciją įvedę atitinkamą numerį ir spauskite
Enter.
Programos funkcijos:
- Nuskaito duomenis iš naudotojo arba failo ir patikrina ar jie yra teisingi (naudojant išimčių valdymą).
- Duoda naudotojui galimybė pasirinkti du galutinio balo skaičiavimo būdus - skaičiuojant vidurkį ar medianą.
- Leidžia pasirinkti 5 skirtingus būdus įvesti, nuskaityti ar sugeneruoti duomenis.
- Dinamiškai paskiria atmintį pagal įvesta / nuskaitytą duomenų kiekį.
- Atidaro testavimo failus ir apskaičiuoja laiką, kurį praleidžia apdorojant duomenis iš failų.
- Visi pranešimai išvedami lietuvių kalbą.
- Projektas išskaidytas į kelis failus (.h ir .cpp).
- Generuoja penkis atsitiktinius studentų sąrašų failus, sudarytus iš: 1 000, 10 000, 100 000, 1 000 000, 10 000 000 įrašų
- Atlieka tyrimus / testavimus su sugeneruotais failais.
- Surūšiuoja studentus ir išveda į du naujus failus.
- Yra 3 skirtingi konteinerio tipo pasirinkimai testavimui - vector, deque, list.
- Yra 3 skirtingos strategijos duomenų skirstymui.
- Naudojama klasė, saugojant studentų duomenis.
- Galima testuoti visus "Rule of five" konstruktorius ir I/O operatorius.
- Yra abstrakti klasė Person, Student klase yra sios klasės išvestinė klasė.
- Norėdami baigti darbą su programa, pasirinkite atitinkamą skaičių.
Klasės naudojami "Rule of five" ir I/O operatoriai.
"Rule of five" yra C++ programavimo kalbos konceptas, kuris apima penkis pagrindinius komponentus, reikalingus objektų valdymui: destruktorius, kopijavimo konstruktorius, kopijavimo priskyrimo operatorius, perkeliamasis konstruktorius ir perkeliamasis priskyrimo operatorius. Šiame projekte "Rule of five" yra taikomas Student klasei.
-
Destruktorius: Šis komponentas naudojamas išvalyti
Studentobjektą, kai jis nebereikalingas. -
Kopijavimo konstruktorius: Šis komponentas leidžia sukurti naują
Studentobjektą, kuris yra identiškas esamamStudentobjektui. -
Kopijavimo priskyrimo operatorius: Šis operatorius leidžia priskirti vieno
Studentobjekto vertę kitamStudentobjektui. -
Perkeliamasis konstruktorius: Šis komponentas leidžia "perkelti"
Studentobjektą, o ne kopijuoti jį. Tai yra efektyvesnis būdas sukurti naująStudentobjektą, kai turime laikinąStudentobjektą, kurio mums nebereikia. -
Perkeliamasis priskyrimo operatorius: Šis operatorius leidžia "perkelti" vieno
Studentobjekto vertę į kitąStudentobjektą, o ne kopijuoti ją.
Be to, šiame projekte yra naudojami įvesties (>>) ir išvesties (<<) operatoriai.
Įvesties operatorius (>>): Šis operatorius naudojamas nuskaitant duomenis iš įvesties srauto (pvz., std::cin ar std::istringstream) į Student objektą.
Išvesties operatorius (<<): Šis operatorius naudojamas rašant Student objektą į išvesties srautą (pvz., std::cout ar std::ostringstream).
Šie operatoriai leidžia lengvai ir efektyviai manipuliuoti Student objektais, nuskaitant duomenis iš įvesties srautų ir rašant juos į išvesties srautus.
Visiems konstruktoriams / operatoriams yra atlikti testai, siekiantys patikrinti ar visi jie veikia. Testus galima atlikti pasirinkus tai per meniu.
Programos sparta naudojant skirtingus kompiliatoriaus optimizavimo lygius
Testavimo sistemos parametrai:
- Saugykla: 256 GB, Integruota NVMe SSD
- Atmintis: 8 GB RAM
- Procesorius: Apple M1
Be optimizavimo testavimas
| Greitis(1mln.) | Greitis(10mln.) | Failo dydis | |
|---|---|---|---|
| Struct | 12.111s | 130.058s | 411kb |
| Klasė | 11.358s | 118.430s | 404kb |
O1 optimizavimo lygio testavimas
| Greitis(1mln.) | Greitis(10mln.) | Failo dydis | |
|---|---|---|---|
| Struct | 2.790s | 30.391s | 162kb |
| Klasė | 11.489s | 117.949s | 147kb |
- Su struktūra greitesni testavimo rezultatai, naudojant šį optimizavimo raktą.
- Struktūros ir klasių failų dydžiai mažesni, naudojant šį optimizavimo raktą.
O2 optimizavimo lygio testavimas
| Greitis(1mln.) | Greitis(10mln.) | Failo dydis | |
|---|---|---|---|
| Struct | 2.662s | 30.459s | 162kb |
| Klasė | 2.767s | 29.540s | 147kb |
- Su klase greitesni testavimo rezultatai, naudojant šį optimizavimo raktą.
- Struktūros ir klasių failų dydžiai išliko tokie patys, kaip su praeitu optimizavimo raktu.
O3 optimizavimo lygio testavimas
| Greitis(1mln.) | Greitis(10mln.) | Failo dydis | |
|---|---|---|---|
| Struct | 2.734s | 28.984s | 161kb |
| Klasė | 2.738s | 29.735s | 162kb |
- Testavimo greičio rezultatai panašūs su praeitu optimizavimo raktu.
- Failų dydžiai minimaliai pasikeitė.
Konteinerių testavimas
Peržiūrėti
Testavimo sistemos parametrai:
- Saugykla: 256 GB, Integruota NVMe SSD
- Atmintis: 8 GB RAM
- Procesorius: Apple M1
1 strategija
Naudojant Vector tipo konteinerius:
| Failo dydis | Skaitymo laikas | Rūšiavimo laikas | Skirstymo laikas | Veikimo laikas |
|---|---|---|---|---|
| 1 000 | 0.023s | 0.004s | 0.005s | 0.033s |
| 10 000 | 0.113s | 0.018s | 0.023s | 0.155s |
| 100 000 | 0.763s | 0.188s | 0.237s | 1.189s |
| 1 000 000 | 7.448s | 2.105s | 2.673s | 12.227s |
| 10 000 000 | 74.810s | 24.911s | 31.783s | 131.505s |
peržiūrėti

Naudojant Deque tipo konteinerius:
| Failo dydis | Skaitymo laikas | Rūšiavimo laikas | Skirstymo laikas | Veikimo laikas |
|---|---|---|---|---|
| 1 000 | 0.023s | 0.004s | 0.005s | 0.034s |
| 10 000 | 0.093s | 0.019s | 0.023s | 0.136s |
| 100 000 | 0.766s | 0.193s | 0.239s | 1.198s |
| 1 000 000 | 7.312s | 2.160s | 2.638s | 12.111s |
| 10 000 000 | 73.857s | 25.580s | 30.620s | 130.058s |
peržiūrėti

Naudojant List tipo konteinerius:
| Failo dydis | Skaitymo laikas | Rūšiavimo laikas | Skirstymo laikas | Veikimo laikas |
|---|---|---|---|---|
| 1 000 | 0.023s | 0.003s | 0.004s | 0.031s |
| 10 000 | 0.112s | 0.018s | 0.023s | 0.154s |
| 100 000 | 0.761s | 0.247s | 0.296s | 1.305s |
| 1 000 000 | 7.352s | 3.322s | 3.818s | 14.493s |
| 10 000 000 | 73.862s | 42.406s | 47.849s | 164.118s |
2 strategija
Naudojant Vector tipo konteinerius:
| Failo dydis | Skaitymo laikas | Rūšiavimo laikas | Skirstymo laikas | Veikimo laikas |
|---|---|---|---|---|
| 1 000 | 0.024s | 0.004s | 0.035s | 0.064s |
| 10 000 | 0.112s | 0.018s | 1.879s | 2.010s |
| 100 000 | 0.762s | 0.184s | 184.637s | 184.637s |
peržiūrėti

- Rezultatų su 1 000 000 ir 10 000 000 nėra, nes per ilgai trunka skaičiavimai (>10min).
Naudojant Deque tipo konteinerius:
| Failo dydis | Skaitymo laikas | Rūšiavimo laikas | Skirstymo laikas | Veikimo laikas |
|---|---|---|---|---|
| 1 000 | 0.021s | 0.004s | 0.006s | 0.032s |
| 10 000 | 0.114s | 0.019s | 0.025s | 0.158s |
| 100 000 | 0.765s | 0.192s | 0.252s | 1.210s |
| 1 000 000 | 7.337s | 2.128s | 2.772s | 12.238s |
peržiūrėti

- Rezultatų su 10 000 000 nėra, nes per ilgai trunka skaičiavimai (>10min).
Naudojant List tipo konteinerius:
| Failo dydis | Skaitymo laikas | Rūšiavimo laikas | Skirstymo laikas | Veikimo laikas |
|---|---|---|---|---|
| 1 000 | 0.023s | 0.003s | 0.001s | 0.028s |
| 10 000 | 0.113s | 0.018s | 0.005s | 0.137s |
| 100 000 | 0.761s | 0.239s | 0.061s | 1.062s |
| 1 000 000 | 7.433s | 3.324s | 0.668s | 11.344s |
| 10 000 000 | 72.891s | 42.406s | 8.586s | 123.646s |
peržiūrėti

3 strategija
Naudojant Vector tipo konteinerius:
| Failo dydis | Skaitymo laikas | Rūšiavimo laikas | Skirstymo laikas | Veikimo laikas |
|---|---|---|---|---|
| 1 000 | 0.023s | 0.004s | 0.001s | 0.028s |
| 10 000 | 0.112s | 0.019s | 0.005s | 0.137s |
| 100 000 | 0.758s | 0.191s | 0.051s | 1.001s |
| 1 000 000 | 7.303s | 2.263s | 0.622s | 10.189s |
| 10 000 000 | 73.373s | 24.204s | 8.597s | 106.176s |
peržiūrėti

Išvados
Remiantis atliktų testų rezultatais, galime padaryti keletą išvadų:
-
Vector tipo konteineriai: Vector tipo konteineriai parodė geriausius rezultatus su mažesniais failais. Tačiau, kai studentų kiekis padidėjo iki 1 000 000 ir 10 000 000, Vector tipo konteinerių veikimo laikas žymiai padidėjo, naudojant antrąją strategiją, kuri yra neefektyvi su šiuo konteineriu tipu. Pirmoji ir trečioji strategija parodė greičiausius rezultatus.
-
Deque tipo konteineriai: Deque tipo konteineriai parodė panašius rezultatus kaip ir Vector tipo konteineriai. Tačiau, jie buvo šiek tiek greitesni su didesniais failų dydžiais. Kaip ir su vektoriais, antroji strategija buvo neefektyvi.
-
List tipo konteineriai: List tipo konteineriai parodė geriausius rezultatus su didesniais failų dydžiais. Jie buvo ypač efektyvūs naudojant antrąją strategiją.
Bendra išvada yra, kad konteinerio tipo ir strategijos pasirinkimas gali turėti didelę įtaką programos veikimo laikui, ypač dirbant su didelėmis duomenų apimtimis.
Senesnių versijų aprašymai
-
v.pradinė: Pradinė versija. Nuskaito vartotojo įvestį, patikrina ją, leidžia vartotojui pasirinkti tarp dviejų galutinio balo skaičiavimo būdų (vidurkis ar mediana), ir išveda duomenis ekrane.
-
v0.1: Prideda galimybę pasirinkti iš 4 skirtingų būdų įvesti arba generuoti duomenis / baigti programą. Dinamiškai paskiria atmintį pagal įvestų duomenų kiekį. Išveda duomenis ekrane.
-
v0.2: Prideda galimybę skaityti duomenis iš failo. Leidžia vartotojui pasirinkti iš 5 skirtingų būdų įvesti, skaityti arba generuoti duomenis. Dinamiškai skiria atmintį pagal įvestą / nuskaitytą duomenų kiekį. Atidaro testavimo failus ir apskaičiuoja laiką, kurį praleidžia apdorojant duomenis iš failų. Išveda duomenis pasirinktinai ekrane arba faile.
-
v0.3: Prideda išimčių valdymą duomenų nuskaitymui. Visi pranešimai išvedami lietuvių kalba. Projektas išskaidytas į kelis failus (.h ir .cpp).
-
v0.4: Prideda galimybę generuoti penkis atsitiktinius studentų sąrašų failus, sudarytus iš: 1 000, 10 000, 100 000, 1 000 000, 10 000 000 įrašų. Atlieka tyrimus / testavimus su sugeneruotais failais. Surūšiuoja studentus ir išveda į du naujus failus.
-
v1.0_pradinė: Prideda 3 skirtingus konteinerio tipo pasirinkimus testavimui - vector, deque, list.
-
v1.0: Yra 3 skirtingos konteinerių testavimo strategijos ir galimybė sukompiliuoti programą, naudojant Makefile.
-
v1.1: Naudojamos klasės su destruktoriais ir konstruktoriais, vietoj struktūrų.
-
v1.2: Prideda galimybė testuoti visus "Rule of five" konstruktorius ir I/O operatorius.


















