Sunteți pe pagina 1din 7

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

net/publication/345897658

Modelarea şi simularea algoritmului Heap Sort în C++, C#, Java, Python şi


PHP, utilizând o platformă computaţională Cloud

Article · December 2019

CITATIONS READS

0 319

1 author:

Teodora-Mihaela Pinzariu
Polytechnic University of Bucharest
6 PUBLICATIONS   0 CITATIONS   

SEE PROFILE

Some of the authors of this publication are also working on these related projects:

Advanced Techniques of Information Extraction From Satellite Image Time Series View project

All content following this page was uploaded by Teodora-Mihaela Pinzariu on 15 November 2020.

The user has requested enhancement of the downloaded file.


Modelarea şi simularea algoritmului Heap Sort
în C++, C#, Java, Python şi PHP, utilizând o platformă
computaţională Cloud

Teodora-Mihaela PÎNZARIU
Universitatea Politehnica din Bucureşti
Facultatea de Electronică, Telecomunicaţii şi Tehnologia Informaţiei
Ingineria Informaţiei şi a Sistemelor de Calulc
e-mail: theopinzariu@gmail.com

Abstract: Începând cu anii 1950 și până în prezent, Figura următoare prezintă clasamentul IEEE Spectrum al
informaticienii au conceput mii de limbaje de programare. celor mai utilizate limbaje de programare din 2019 și
Multe dintre ele nu sunt deloc cunoscute, fiind create pentru aplicabilitatea acestora: utilizate pentru dezvoltarea site-urilor și
teme de cercetare sau de doctorat. Altele au devenit populare aplicațiilor web, a aplicațiilor pentru dispozitive mobile, utilizate
pentru o vreme, dar au ieșit din uz treptat din cauza pentru desktop și aplicații științifice sau pentru programarea
limitărilor pe care le impuneau asupra sistemelor dispozitivelor de tip controler.
informatice. De-a lungul timpului, puține limbaje au devenit
populare într-o maniera satisfăcătoare, astfel încât sa fie Limbajul de programare Tipul utilizării Clasament
utilizate de marea majoritate a programatorilor
profesioniști. Această lucrare își propune să compare viteza
de execuție, memoria utilizată, precum și principalele
avantaje și dezavantaje ale unora dintre cele mai populare și
mai utilizate limbaje de programare (C++, C#, Java, Python
şi PHP) în momentul simulării unui algoritm de sortare
(Heap Sort) pe o platformă computaționlă de tip Cloud.
Rezultatul acestui studiu arată faptul că un limbaj compilat
și optimizat va avea o viteză mult mai mare de execuție și o
memorie consumată mai mică față de un limbaj interpretat.

Cuvinte cheie: Heap Sort, viteză de execuție, memorie


utilizată, limbaje de programare, Cloud.

I. INTRODUCERE

Un limbaj de programare este un limbaj formal de expresii


și reguli (sau tehnici) valide de formulare a instrucțiunilor pentru
un computer. Un limbaj de programare are definite un set de
reguli sintactice și semantice. [1]
Comparativ cu limbajele naturale care s-au dezvoltat și au
evoluat independent, limbajele de programare sunt mult mai
asemănătoare între ele. Acest lucru se întâmplă deoarece:
 mai multe limbaje de programare împart aceleași
fundamente matematice (ex.: algebra booleană, logica);
 asigură funcționalități similare (ex.: aritmetica,
operațiile logice, procesarea textului);
 au la bază aceleași componente hardware și seturi de
instrucțiuni; Fig. 1 Clasament IEE Spectrum[2]
 au obiective comune de proiectare: găsirea limbajului
de programare care să asigure o scriere simplificată Obiectivul acestei lucrări este acela de a realiza o
pentru utilizatori și o execuție eficientă pentru scurtă prezentare despre 5 dintre cele mai utilizate limbaje de
hardware. programare, evidențiindu-le avantajele și dezavantajele. În
literatura de specialitate, există numeroase articole care compară al algoritmului va uşura sarcina paşilor ce urmează, ceea ce duce
din punct de vedere teoretic aceste limbaje de programare. Ceea la performanţa foarte bună a algoritmului.
ce aduce în plus această lucrare constă în faptul că această Pentru sortarea a n elemente, Heap Sort are o complexitate
comparație nu va fi pur teoretică, ci va porni de la un exemplu de 𝑂(𝑛log𝑛) în toate cazurile posibile: cel mai favorabil, mediu
concret, analizând comportamentul fiecărui limbaj în modelarea și cel mai nefavorabil.
și simularea algoritmului de sortare Heap Sort.

II. ALGORITMUL III. MEDII DE MODELARE

Algoritmii de sortare reprezintă operații de ordonare a unor În funcţie de modul de execuţie al programelor, limbajele
articole (de cele mai multe ori, vectori de valori) în funcție de de programare se împart în două categorii :
diverse criterii. Metodele de sortare cele mai des utilizate pot fi  Interpretate: Instrucţiunile sunt citite linie cu linie de
clasificate în două categorii: metode directe și metode avansate. un program numit interpretor şi traduse în cod maşină.
Metodele directe au la bază algoritmi de dificultate redusă, Au avantajul simplității, dar dezavantajul unei viteze de
ușor de găsit și înteles, precum sortarea prin selecție (Select execuţie redusă;
Sort), sortarea prin inserție (Insert Sort) și sortarea cu bule  Compilate: Codul sursă al programelor este
(Bubble Sort). transformat de compilator într-un cod ce poate fi
Metodele avansate au la bază algoritmi mai complicați, executat direct de procesor. Au ca avantaj execuţie
precum sortarea rapidă (Quick Sort), sortarea prin terclasare rapidă, dar dezavantajul absenței portabilităţii, codul
(Merge Sort) și sortarea cu ansambluri (Heap Sort). compilat într-un format de nivel scăzut neputând fi
rulat decât pe platforma pe care a fost compilat.
Algoritmul Heap Sort a fost inventat de J.W. J. Williams în În ceea ce privește mediile de modelare pentru
1964 și este un algoritm de sortare care combină calitățile implementarea algoritmului Heap Sort, au fost alese limbajele
sortării prin inserție cu cele alea sortării prin interscalare. de programere: C#, C++, Java, Python și PHP, fiind unele dintre
Pentru realizarea sortării, algoritumul utilizează ansambluri cele mai utilizate limbaje de programare din ultimii ani.
(Heap-uri) binare, adică un arbore binar care are proprietățile:
 este complet, adică toate nivelele sunt pline (cu posibila
excepție a ultimului nivel), ceea ce înseamnă că are o A. C#
înălțime minimă;
 cu excepția nodului rădăcină, între orice nod și părintele C# derivă din două dintre cele mai de succes limbaje de
lui există aceeasși relație de ordine. programare: C și C++. . De la C, C# moșteneste sintaxa, multe
Dacă nodurile conţin numere întregi după care se stabilește din cuvintele cheie și operatorii și de la C++ preia modelul
relaţia de ordine, heap-ul poate fi de două feluri: max-heap sau programării orientate pe obiect. De asemenea, limbajul este o
min-heap. În cazul max-heap, rădăcina are cel mai mare număr, “rudă” apropiată a limbajului Java. Creat ca instrument de
iar relația de la orice copil la părinte este mai mic sau egal.În dezvoltare pentru arhitectura .NET, limbajul oferă o modalitate
cazul min-heap, rădăcina are cel mai mic număr, iar relația de la facilă și eficientă de a scrie programe pentru sistemul Windows,
orice copil la părinte este de mai mare sau egal. internet, componente software etc.
Pentru a ordona crescător un vector de numere întregi prin Arhitectura .NET definește un mediu de programare care
implementarea algoritmului Heap Sort, se realizează permite dezvoltarea și execuția aplicațiilor indiferent de
următoarele etape: platformă. Aceasta permite programarea în limbaj mixt și oferă
facilități de securitate și portabilitate a programelor.
 Se formează din elementele vectorului arborele binar.
Motorul comun de programare (CLR - Common Language
Fiecare poziție din vector reprezintă un nod, rădăcina
Runtime) se ocupă de execuția programelor C#. El asigură de
fiind pe pozitia 0(zero). Fiecare nod k părinte are copiii
asemenea programarea în limbaj mixt, securitatea și
2k+1 și 2k+2. Dacă nu există poziția din vector cu
portabilitatea programelor. Atunci când este compilat un
indicele respectiv, atunci nu există niciun nod copil.
program C#, sau un program în limbaj mixt, rezultatul compilarii
 Se formează un max-heap din aceeași reprezentare.
nu este un cod executabil. În locul acestuia, se produce un fișier
 Se extrage maximul din rădăcina heap-ului(poziţia 0 care conține un tip de pseudocod numit limbaj (IL - Intermediate
din vector) şi se face o interschimbare între poziţia Language). Acest fișier IL poate fi copiat în orice calculator care
maximului şi ultima poziţie din vector. Acum maximul
dispune de .NET CLR.
se află pe poziţia dorită şi se poate exclude din heap.
 Se repetă paşii (se reface forma de heap, se extrage noul
Avantaje Dezavantaje
maxim, se reduce cu 1 numărul de elemente nesortate),
cât timp mai sunt elemente în heap. Biblioteca de clase .NET Flexibilitate redusă din
permite dezvoltarea cauza dependenței de
Asemănarea cu sortarea prin selecție provine de la faptul rapida a aplicațiilor biblioteca .NET
că, la fiecare pas, cel mai mic element din vector este găsit şi Eliberare automată a
Timp de execuție mai mic
mutat în spatele vector, fiind ignorat de paşii următori, care vor memoriei (garbage
decât cel din C++
continua pe restul vectorului.. Diferenţa faţă de SelSort este că collection)
paşii următori ai algoritmului vor depune un efort mai mic Backup mare de Recompilarea la orice
pentru a depista minimul din tabloul rămas. Astfel, fiecare pas memorie modificare a codului
Tabelul 1. Avantajele și dezavantajele limbajului C#
B. C++ Python pune accentul pe curățenia și simplitatea codului,
iar sintaxa sa le permite dezvoltatorilor să exprime unele idei
Reprezintă un update al limbajului C, fiind dezvoltat în programatice într-o manieră mai clară și mai concisă decât în
anul 1979. Este un limbaj multi-paradigmă (adică alte limbaje de programare, ca C++. În ceea ce privește
implementează mai multe stiluri de construire a elementelor și paradigma de programare, Python poate servi ca limbaj pentru
structurilor) printre care și cel orientat pe obiecte, mult mai util software de tipul object-oriented, dar permite și programarea
în cadrul proiectelor mai mari. Deși este destul de vechi (atunci imperativă, funcțională sau procedurală.
când vorbim de tehnologie), C++ stă la baza unor programe Din punct de vedere al modului de execuție, programele
extem de utilizate, cum ar fi Firefox, Winamp sau Adobe. Python sunt doar interpretate, ceea ce înseamnă o viteză de
În prelucrarea vectorială a datelor, C++ este unul dintre execuție redusă.
cele mai rapide limbaje de programera, fiind un limbaj pre-
compilat care nu are nevoie de niciun interpretor în timpul
compilării. Avantaje Dezavantaje
Lipsa restricțiilor în ceea
Multe biblioteci extinse,
Avantaje Dezavantaje ce privește tipul
ceea ce înseamnă mai
variabilelor poate cauza
Utilizarea pointerilor, puțin cod
Portabilitate mare pentru erori de run-time
care consumă multă
orice sistem de operare Cod ușor de citit, de scris, Consum mare de
memorie
de învățat memorie
Viteza mare la rulare, Memoria nu se eliberează
Fiind un limbaj Performanța – Limitarea
deoarece este un limbaj automat (absența
interpretat, debugging-ul vitezei, din cauza
compilat garbage collector)
se realizează ușor interpretării
Compatibilitatea cu alte Biblioteca standard cu
Tabelul 4. Avantajele și dezavantajele limbajului Python
limbaje (C) funcții puține
Tabelul 2. Avantajele și dezavantajele limbajului C++
E. PHP
C. Java PHP (Hypertexted Preprocesor) este un limbaj de
programare procedural interpretat, de scripting server-side,
Java este un limbaj de programare orientat pe obiecte, utilizat pentru creare de pagini dinamice. Sintaxa Php este
lansat inițial de Sun Microsystems (actual Oracle) in 1995. Java inspirată din C și Java, limbajul oferind suport pentru
derivă din carateristicile originale de la SmallTalk având o programarea obiect orientată și pentru accesul la baze de date.
sintaxa similară cu C si C++. În comparatie cu cele două limbaje Secvențele de cod PHP se include în paginile HTML.
menționate, Java este mai ușor de învatat pentru că, prin natura
sa, a fost conceput cu gîndul de a evita erorile de compilare si Avantaje Dezavantaje
alocare a memoriei care apar la celelalte două limbaje.
Foarte utilizat în aplicații Nu este optimizat pentru
Din punct de vedere al modului de execuție, programele
Java sunt compilate și apoi interpretate. Motivul pentru acest web utilizarea pe desktop
sistem este introducerea în flow-ul de execuție a unui strat Eliberare automată a
Necesitatea cunoștințelor
suplimentar, numit Mașina Virtuală Java, care are rolul de a memoriei (garbage
de HTML
asigura portabilitate și securitate, acest layer comportându-se ca collection)
un sandbox. Scalabilitate mare și
Absența unui mecanism
acces rapid la baza de
de manipulare a erorilor.
Avantaje Dezavantaje date
Tabelul 5. Avantajele și dezavantajele limbajului PHP
Utilizarea, scrierea, Memoria - Consumă
compilarea și debugging- memorie considerabil
ul ușor de realizat mai multă față de C++. În ceea ce priveşte simularea, s-a ales utilizarea unei
Costul – Preț mare al platforme Cloud deoarece prezintă următoarele beneficii:
Crearea programelor
componentelor hardware  Securitatea datelor - Serviciile cloud dispun de servere
standard și reutilizarea
pentru a suporta echipate cu soluții optime pentru protejarea datelor și pentru
codului
memoria mare. păstrarea acestora într-un mediu securizat.
Trecerea simplă de la un Performanța - Timpul de  Reducerea costurilor - Utilizarea serviciilor în cloud
sistem automat de execuție a programelor reduce considerabil costurile operaționale eliminând necesitatea
prelucrare a datelor la este mult mai mare decât achiziționării echipamentelor hardware și software.
altul cel din C++.  Mobilitate - Accesul la informații se face rapid și
Tabelul 3. Avantajele și dezavantajele limbajului Java securizat de pe orice tip de dispozitiv mobil, fiind necesară doar
conexiunea la internet.
D. Python  Stocare rapidă - Datorită echipamentelor performate,
Python este un limbaj de programare dinamic, multifuncțional cloud-ul are o capacitate imensă de stocare a datelor și permite
utilizat de către companii precum Google sau Yahoo! mai ales transferul rapid de informații.
prentru programrea aplicațiilor web, însă există și o serie de  Partajarea fișierelor - Serviciile in cloud permit
aplicații științifice sau de divertisment programate parțial sau în partajare facilă a fișierelor cu clienții, furnizorii sau partenerii
întregime în Python. companiei. Există posibilitatea de a crea un link pentru fiecare
fișier stocat în cloud, acesta se poate transmite pe email, mesaj
sau orice altă cale de comunicare și poate fi accesat de către
destinatar fără a fi nevoie ca fișierul să fie salvat în dispozitiv.
 Backup-ul datelor - Serviciile in cloud îți oferă control
Timpul de execuție
asupra proceselor de backup. În situația în care dispozitivul pe 6,953
care îl utilizezi se defectează și pierde toate informațiile Timp
(ms)
înregistrate, acestea se regăsesc în mediile protejate oferite prin
utilizarea serviciilor cloud și pot fi accesate cu ușurință de pe 7
orice alt dispozitiv. 4,8064
6

5
IV. SIMULARE
4
Pentru a putea compara timpul de excuție și memoria 3 1,569
utilizată în rularea unui algoritm de sortare, s-a implement
algoritmul Heap Sort în toate cele 5 limbaje de programare 2 0,3508 0,2846
prezentate mai sus și simulările s-au realizat pe o platformă 0,2263 0,0155 0,1259 0,2722 0,231 1000
1 0,22 0,0014 0,0129 0,0193 0,0128
computațională de tip Cloud, și anume IDE One.
Pentru fiecare implementare în parte s-au utilizat exact 0 10
aceleași seturi de date. Mai exact, au fost făcute câte trei C# C++ Java Python PHP
măsurători pentru fiecare limbaj de programare, în care
algoritmul HeapSort sorta un vector cu 10, cu 100 și cu 1000 de
Numărul de elemente: 10 100 1000
elemente.
Datele colectate în uma simulărilor se pot observa în cele Fig.2 Timpul de execuție
două tabele de mai jos, semnificative pentru timpul de execuție
și memoria utilizată la fiecare simulare.

Timpul de
execuţie [ms]
Numărul de elemente sortate

Limbaj de
progrmare
10 102 103 Memoria utilizată
C# 0.2200 0.2263 0.3508
C++ 0.0014 0.0155 0.2846 Memoria 48,5195
Java 0.0129 0.1259 4.8064 (MB)
44,8164
Python 0.0193 0.2722 6.9530 50
45 41,6758
PHP 0.0128 0.2310 1.5690
40
Tabelul 6. Timpul de execuție
35
30 17,524 17,0352
25 17,148 16,9688
Memoria 17,18
utilizată [MB]
Numărul de elemente sortate 20 16,8242
9,354
9,188
15 3,2984 9,164
Limbaj de 3,2728
10 102 103 10
programare 3,2433 1000
5
C# 17.18 17.148 17.524 10
0
C++ 3.2433 3.2728 3.2984 C# C++ Java Python PHP
Java 41.6758 44.8164 48.5195
Python 9.164 9.188 9.354
PHP 16.8242 16.9688 17.0352
Numărul de elemente: 10 100 1000
Tabelul 7. Memoria utilizată
Fig.3 Memoria utilizată
Pentru o comparație mai clară a rezultatelor celor 5 limbaje
de programare, se trasează umătoarele diagrame:
În urma analizei datelor coletate și a studierii diagramelor V. CONCLUZII
de mai sus, se pot concluziona următoarele:
 C++ oferă cele mai bune rezultate, atât în cazul vitezei Obiectivul acestei lucrări a fost acela de a realiza o sinteză
lde excuție, cât și în cazul utilizării memoriei; a 5 dintre cele mai utilizate limbaje de programare,
 Cea mai mică viteză de execuție o are limbajul Python; evidențiindu-le avantajele și dezavantajele şi de a prezenta
 Cea mai multă memorie a utilizat-o limbajul Java; beneficiile utilizării unei platforme Cloud pentru simularea
programelor.
Dar de ce se întâmplă astfel lucruile? Pentru a putea compara performanţele acestor limbaje de
Limbajele mai mai noi de programare, de la care ne-am fi programare, s-a ales unul dintre cei mai eficienţi algoritmi de
așteptat să avem cele mai bune rezultate, precum Java sau sortare (Heap Sort), s-a implementat separat pentru fiecare
Python, prezintă caracteristici care facilitează scrierea limbaj şi s-au masurat timpul de execuţie şi memoria utilizată
programului și ușurează munca programatorului, dar care, în pentru diferite valori ale lungimii vectorului sortat.
fond, reduc performanțele de tipul vitezei de execuție și ale S-a putut observa faptul că, atât în cazul vitezei de
memoriei. Vom analiza în continuare principalele diferențe care execuţie, cât şi in cel al consumului memoriei, limbajul C++ a
au dus la aceste rezultate, mai ales în cazul extremelor C++, Java avut cele mai bune rezultate, iar cele mai slabe rezultate
și Python: obţinându-se la simularea programelor în limbajele Java şi
 Compilare vs. Interpretare – Unul dintre motivele Python.
pentru care C++ este mai rapid îl reprezintă faptul că acesta este Astfel, se poate concluziona faptul că, deşi cele mai noi
un limbaj compilat, spre deosebire de Java (compilat și limbaje de programare prezintă o mare portabilitate datorată
interpretat) și Python (interpretat), ceea ce înseamnă că execuţiei prin interpretare şi caracteristici care uşurează scrierea
programul a fost transformat de compilator în cod ce poate fi codului, precum dinamica limbajului şi managementul automat
executat direct de procesor. al memoriei, aceste avantaje reduc, în fond, viteza de execuţie şi
În schimb, la Python, s-a dorit portabilitatea, care a adus după consumă mult mai multă memorie. Putem spune că pentru a
sine viteza scazută de execuție. Interpretarea codului este mai obţine cele mai bune rezultate, programatorul trebuie să utilizeze
lentă decât executarea codului direct pe hardware, deoarece un limbaj compilat (C++) şi să depună mai mult efort în scrierea
implică o mașină virtuală. Astfel, doar mașina virtuală trebuie să codului, ţinând cont de variabilele tastate static şi de eliberarea
fie compilată pentru un anumit sistem de operare pe un procesor manuală a memoriei.
specific. Iar tot codul pe care îl rulează va rula pe orice dispozitiv
care are Python. Procesul este similar cu cel al modului de
execuție la Java. Atunci de ce este Python mai lent decât Java? VI. BIBLIOGRAFIE
 Limbaj dinamic – Python este mai lent decât Java și,
implicit, C++, deoarece este un limbaj dinamic. Spre deosebire [1] Computer Hope, Programming language,
de aceste două limbaje, la care variabilele sunt tastate static, în https://www.computerhope.com/jargon/p/programming-
Python, acestea sunt tastate dinamic, adică programatorul nu language.htm, accesat la data 18.12.2019
trebuie să declare variabilele sau tipul lor înainte de a le utiliza. [2] Stephen Cass, The Top Programming Languages,
Acest lucru înseamnă că, în momentul compilării, tipul https://spectrum.ieee.org/static/interactive-the-top-
variabilei nu este cunoscut și el este interpretat abia la rulare.
programming-languages-2019, accesat la data 18.12.2019
Astfel, deși programatorul are o viteza mult mai bună de codare
și o flexibilitate mult mai mare, interpretarea tipului de variabilă [3] Mike Grant, Zachary Palmer, Scott Smith, Principles
încetinește viteza de execuție. De asemenea, în Python, fiecare of Programming Languages, Version 1.0.2, Creative Commons
variabilă este considerată un obiect, ceea ce implică o alocare Attribution-Share Alike, 2016
mai mare de memorie. [4] Gilles Dowek, Principles of Programming Languages,
 Managementul memoriei – Acesta este încă un aspect Springer, 2009
despre care se poate spune că avantajul lui vine cu un [5] Vasile Cioban, Curs - Algoritmi de sortare,
compromis. C++ nu are un control automat al memoriei. Universitatea Babeș-Bolyai, Cluj-Napoca
Gestionarea acesteia o realizează programatorul. Astfel, deși se [6] Cormen, T. H., Leiserson, C. E., Rivest, R. L.,
depune mai mult efort în scrierea codului, timpul de răspuns este Introduction to Algorithms, McGraw-Hill, New York, 1990.
considerabil mai bun decât în cazul limbajelor Java sau Python [7] David Broscoteanu, Curs – Structuri de date și
care au o eliberarea automată a memoriei (garbage collector).
algoritmi, Facultatea de Automatică și Calculatoare,
Acest proces adițional degradează performanțele programelor
Universitatea Politehnica din București
scrise în Java sau Python deoarece eliberarea memoriei este
întârziată până când se atinge un anumit prag sau până când se [8] Herbert Schildt, C#, Editura Teora (traducere, 2002)
utilizează toată memoria disponibilă, ceea ce duce atât la un [9] Karli Watson et al., Beginning Visual C#, Wrox Press
consum mare de memorie, cât și la o viteză încetinită de Ltd. (2002)
execuție. [10] DataFlair Team, C++ Tutorial – A Comprehensive
Guide for 2019, https://data-flair.training/blogs/cpp-tutorial/,
accesat la data 22.12.2019
[11] Wiki DCAE PUB, Noțiuni despre Java,
https://wiki.dcae.pub.ro/index.php/No%C8%9Biuni_despre_Ja
va, accesat la data 22.12.2019
[12] Wiki Books, Python Programming,
https://en.wikibooks.org/wiki/Python_Programming, accesat la
data 22.12.2019
[13] Mihai Gabroveanu, Curs - Programarea aplicațiilor
WEB. Limbajul PHP, Departamentul de Informatica,
Universitatea din Craiova
[14] IDE One, https://ideone.com/, accesat la data
22.12.2019

View publication stats

S-ar putea să vă placă și