C# IR JAVA PROGRAMAVIMO KALBŲ LYGINAMOJI ANALIZĖ

Similar documents
JAVA pagrindai Lek. Liudas Drejeris

C++ programavimo kalba. Konstruktorius, destruktorius, klasių metodų modifikatoriai, objektų masyvai (4 paskaita)

Kas yra masyvas? Skaičių masyvo A reikšmės: Elementų indeksai (numeriai): Užrašymas Turbo Paskaliu: A[1] A[2] A[3] A[4] A[5]

El. pašto konfigūravimas

Come to the TypeScript

C programavimo kalba. 3 paskaita (Sąlygos ir ciklo operatoriai, funkcija scanf() )

C programavimo kalba. 5 paskaita (Funkcijos, masyvai)

Elektroninis.lt šakninių sertifikatų diegimas

Parengė ITMM Artūras Šakalys 1

ios Uždara operacinė sistema skirta tik Apple įrenginiams: iphone ipad ipod touch Apple TV

Struktūrų sintaksė Struktūra tai vienodo arba skirtingo tipo kintamųjų rinkinys. Sintaksė: struct vardas { ; type1 var1; type2 var2;... typen varn; //

Apletai (įskiepiai) Lekt. dr. Pijus Kasparaitis m. m. pavasario semestras.

C++ programavimo kalba

PHP PROGRAMOS EIGOS VYKDYMO VALDYMAS

Projektas. .h failai Header failai (interface) .m failai Pačios programos failai ( .xib /.storyboard Vartotojo sąsajos failai

Buferio perpildymo klaida Įvadas, techniniai klausimai

Amadeus On-Line Helpdesk

Gijos. Gijų modelis Javoje. R.Vaicekauskas, OP, 2017

Polimorfizmas. Lekt. dr. Pijus Kasparaitis m. m. pavasario semestras.

Pasirenkamojo modulio kūrybinio darbo atlikimas ir vertinimas

2-3 PASKAITOS. Paprasčiausia programa:

Informacijos apsaugos standartai serija

C++ programavimo kalba

Trumpai-ilga istorija

Kodėl programą sudaro daug failų? Sukurtos tipinės funkcijų galėtų būti panaudojamos dar kartą; Sudaroma aiškesnė programos struktūra; Sudaroma galimy

Paveikslėliai. Lekt. dr. Pijus Kasparaitis m. m. pavasario semestras.

ĮVADAS JVM Java Virtual Machine Java virtualios mašinos (JVM) JVM write once, run everywhere

WWW aplikacijų saugumas 2

A.Kynienė. С, C++ kalbų ABC. Metodinė priemonė

Programavimas C kalba

Redis Ma as, greitas, galingas. Specialiai VilniusPHP

Vilniaus universitetas Fizikos fakultetas Radiofizikos katedra R. Grigalaitis Programavimas (Programavimo C++ kalba paskaitų konspektas)

INFORMACINĖS SISTEMOS INVENTORIAUS VALDYMO SISTEMA

HTML dokumentai. Praktinės užduotys

2017 m. pagrindinės sesijos informacinių technologijų valstybinio brandos egzamino programavimo užduoties galimi sprendimai

Sequential Nonlinear Mapping versus Simultaneous One

Tautvydas Dagys Microsoft Lietuva

Naujos galimybės su Lotus Notes 8.5.1: naudotojams ir programuotojams

Interneto technologijų taikymai

C++ programavimo kalba

C++ programavimo kalba

Paskirstytos atminties lygiagretusis programavimas Įvadas į MPI

LOGINĖS DB SCHEMOS ATSTATYMAS NAUDOJANT JDBC

C++ programavimo kalba

K R I S T I N A L A P I N. I dalis. Matematikos ir statistikos studijų krypčių pirmo kurso studentams

Uždavinių sprendimas MATLAB aplinkoje

C# ir VB.NET palyginimas taikomųjų programų kūrimo požiūriu

VERSLO KLIENTŲ APTARNAVIMAS TEL

DUOMENŲ STRUKTŪROS IR ALGORITMAI. Rūšiavimo algoritmai (įterpimo, burbulo, išrinkimo)

JAVA PROGRAMOS KODO ANALIZĖS NAUDOJANT SCRO ONTOLOGIJĄ GALIMYBIŲ TYRIMAS

ELEKTRONINIŲ PROJEKTŲ RENGIMO IR VALDYMO SISTEMA

ŠIAULIŲ UNIVERSITETAS MATEMATIKOS IR INFORMATIKOS FAKULTETAS INFORMATIKOS KATEDRA. Mindaugas Gapšys BAKALAURO DARBAS

PROGRAMINĖS ĮRANGOS KŪRIMO PRIEMONIŲ MOBILIOSIOMS PLATFORMOMS TYRIMAS

Atminties technologijos

ŽILVINAS VAIRA. Programinės įrangos kūrimo technologijos. Mokomoji priemonė

PHP Lietuviškai. Turinys

Web technologijos. Hostingas JavaScript PHP

WVGA :9 None. This is the only supported resolution for Windows Phone OS 7.1.

Pažintis su C++ Builder

T u r b o P a s k a l i s 7.0

Step-by step guide for MRU students to uploading Master s Thesis to elaba repository

VILNIAUS PEDAGOGINIS UNIVERSITETAS MATEMATIKOS IR INFORMATIKOS FAKULTETAS INFORMATIKOS KATEDRA EDITA MUDURYTĖ

KOMPIUTERIŲ TINKLAI. 5 paskaita Tinklo lygmuo, IP protokolas

Lokalizuojamųjų programinės įrangos išteklių metainformacijos formalizavimo metodas

Paprastų lentelių kūrimas

Baltymų struktūrų modeliavimas naudojant HHpred ir SWISS-MODEL Laboratorinis darbas

II SEKCIJA. Duomenų bazės ir modeliai

Microsoft Access ir Visual FoxPro duomenų bazių valdymo sistemų palyginimas

Virtualizavimo infrastruktūros parinkimas ir taikymas mažose ir vidutinio dydžio įmon se

Programos kodo generavimas naudojant UML veiksmų semantiką

IBM Trusteer Fraud Protection

Principles of Computer Architecture Processors Lecture 1

PROJEKTAS PROFESIJOS MOKYTOJŲ IR DĖSTYTOJŲ TECHNOLOGINIŲ KOMPETENCIJŲ TOBULINIMO SISTEMOS SUKŪRIMAS IR ĮDIEGIMAS (NR.: VP1-2.2-ŠMM-02-V ) 1

DUOMENŲ BAZIŲ VALDYMO SISTEMŲ ANALIZĖ

Vienlusčių įtaisų projektavimas. 1 paskaita

16. ŠABLONAI. int abs( int ); float fabs( float ); double dabs( double ),...

6-7-8 PASKAITOS. Bendros žinios

PROGRAMAVIMAS IR PROGRAMINĖ ĮRANGA

2011 m. valstybinio brandos egzamino uþduotis, pagrindinë sesija

KAUNO TECHNOLOGIJOS UNIVERSITETAS

C++ programavimo kalba

Išplėtimo lizdai gale (kiekis): 7 Korpuso spalva: Black Išorinių 5.25" lizdų skaičius: 4 Išorinių 3.5" lizdų skaičius: 1 Vidinių 3.

KAUNO TECHNOLOGIJOS UNIVERSITETAS INFORMATIKOS FAKULTETAS INFORMACIJOS SISTEMŲ KATEDRA

Programinio kodo saugumas

Scrum su Kanban naudojančios organizacijos programų sistemų kūrimo proceso vertinimas

Aktyvaus procesų stebėjimo kompiuteryje programinės įrangos kūrimas ir tyrimas

Asta Čitavičienė LIBRARY

4 SKYRIUS. Programuojamieji loginiai valdikliai. Įvadas

PROJEKTAS BRANDOS EGZAMINŲ KOKYBĖS SISTEMOS PLĖTRA. arba

Sisteminio lygmens projektavimo automatizavimas naudojant aktoriais paremtą modeliavimą ir UML

LARGE-SCALE SET PARTITIONING PROBLEMS: SOME REAL-WORLD INSTANCES HIDE A BENEFICIAL STRUCTURE

2006 m. valstybinio brandos egzamino užduotis

Didelės apimties svetainės optimizavimas taikant SEO principus

GREITAS IR TIKSLUS OBJEKTO PARAMETRŲ NUSTATYMAS MAŠININĖS REGOS SISTEMOSE

KLIENTŲ DUOMENŲ BAZĖS IR SANTYKIO SU KLIENTAIS VALDYMO PROGRAMA

Masyvai Javoje. Masyvai. Objektų talpyklos. Masyvo tipas. Deklaravimo pavyzdžiai. Deklaracija ir sukūrimas. Masyvo superklas - Object

Vilniaus Gedimino technikos universitetas,

FUNDAMENTINIŲ MOKSLŲ FAKULTETAS GRAFINIŲ SISTEMŲ KATEDRA. Tadas Kazakevičius

C programos struktūra ir funkcijos

C++ programavimo kalba

Transcription:

LIETUVOS EDUKOLOGIJOS UNIVERSITETAS GAMTOS, MATEMATIKOS IR TECHNOLOGIJŲ FAKULTETAS INFORMATIKOS KATEDRA Arvydas Putna C# IR JAVA PROGRAMAVIMO KALBŲ LYGINAMOJI ANALIZĖ Magistro baigiamasis darbas Darbo vadovas: doc. Dr. Grigorijus Melničenko Vilnius, 215

TURINYS ĮVADAS... 4 Darbo tikslas... 4 Iškelti uždaviniai... 5 TEORINĖ DALIS... 6 JAVA PROGRAMAVIMO KALBA... 6 Java programavimo kalbos istorija... 6 Java kalbos savybės... 6 Java programos veikimas... 7 Java programos kodo kompiliavimas tiesiogiai į mašininį kodą... 8 Darbo pradžia su Java... 9 C# PROGRAMAVIMO KALBA... 9 C# programavimo kalbos istorija...1 C# kalbos savybės...1 C# programos veikimas...11 C# programos kodo kompiliavimas tiesiai į mašininį kodą...12 Darbo pradžia su C#...12.NET Framework... 13 Mono projektas... 14 Programa C#irC++/CRLkalbomis...16 Duomenų tipai... 19 Matematiniai skaičiavimo paketai... 22 EKSPERIMENTINĖ DARBO DALIS... 24 Naudojama kompiuterinė ir programinė įranga... 24 Laiko skaičiavimas... 24 Paprastų matematinių operacijų greičiai... 25 2

Duomenų skaitymas iš failo naudojant srautus... 27 Trikampių plotų skaičiavimas... 31 Kvadratinių lygčių sprendimas... 35 Duomenų įrašymas į tekstinius failus... 43 Lokaliosios duomenų bazės... 47 Darbo pradžia su SQLite duomenų baze... 48 Darbas su SQLite duomenų baze...48 Duomenų skaitymas iš SQLite duomenų bazės...49 Doumenų įrašymas į SQLite duomenų bazę...53 Darbo pradžia su Access duomenų baze... 55 Darbas su Access duomenų baze...56 Duomenų skaitymas iš Access duomenų bazės...57 Duomenų įrašymas į Access duomenų bazę...6 Java baitkodo ir mašininio kodo palyginimas... 62 C# ir Java aplikacijos kūrimą mobiliesiems telefonams... 66 IŠVADOS PLAČIAU... 73 IŠVADOS TRUMPAI... 79 LITERATŪRA... 83 SANTRAUKA... 84 SUMMARY... 85 3

ĮVADAS Parašytas ne vienas leidinys, kuriame lyginamos Java ir C# programavimo kalbos. Straipsniuose paprastai lyginami programų kodai, savybės, kuriomis pasižymi Java ar C#. Publikacijose įžvelgiamas autorių šališkumas, kai pabrėžiamos vienos programavimo kalbos savybė, kurių neturi kita. Ir neužsimenama apie silpnąsias vietas, kuriose programavimo kalba nusileidžia savo galimybėmis. Tačiau niekur nekalba, kuri programavimo kalba greičiau veikai atlikdama vienas ar kitas operacijas. Darbą sudaro du pagrindiniai skyriai. Pirmame skyriuje apžvelgiama Java ir C# kūrimo istorija, kalbų veikimo principai. Antrame skyriuje nagrinėjami Java ir C# programų greičiai vykdant tas pačias operacijas ir naudojant tuos pačius duomenis. Tyrime nagrinėjama: duomenų skaitymo iš tekstinių failų greitis, duomenų įrašymo į tekstinius failus greitis, matematinių operacijų atlikimo greitis, darbo su lokaliomis duomenų bazėmis greitis. Darbe tai pat lyginamas programų kūrimas išmaniesiems įrenginiams naudojant C# ir Java. Darbo tikslas Atlikti programavimo kalbų C# ir Java lyginamąją analizę ir nustatyti, kurią programavimo kalbą rinktis mokytis, darbui. 4

Iškelti uždaviniai Apžvelgti C# ir Java programavimo kalbų kūrimo istorijas. Palyginti Java ir C# tarpinio kodo (baitkodo ir pseudo) kūrimą. Palyginti Java ir C# kompiliatorius (JVM ir CRM). Palyginti vykdomųjų programų (exe) Java ir C# failų kūrimą. Palyginti Java ir C# parašyto kodo vykdymo greitį atliekant matematinius skaičiavimus. Palyginti Java ir C# parašyto kodo vykdymo rašant duomenis į failus. Palyginti Java ir C# parašyto kodo vykdymo greitį skaitant duomenis iš failų naudojant srautus buffer. Palyginti lokaliąsias duomenų Java ir C# bazes. Atlikti darbo greičių tyrimus su lokaliomis duomenų Java ir C# bazėmis. Palyginti C# ir Java aplikacijos kūrimą mobiliesiems telefonams su pavyzdžiais (interaktyviųjų knygų kūrimas). 5

TEORINĖ DALIS JAVA PROGRAMAVIMO KALBA Java programavimo kalbos istorija Java programavimo kalbą sukūrė: James Gosling, Patrick Naughton, Chris Warth, Ed Frank, ir Mike Sherida firmoje Sun Microsystems 1991 metais. Pirmąją veikiančią versiją sukurti užtruko 18 mėnesių. Ši kalba turėjo būti pavadinta Oak (Ąžuolas), tačiau pavadinimas buvo pakeistas į Java. Pagrindinis naujos kalbos kūrimo tikslas buvo sukurti kalbą, nepriklausomą nuo platformos (neutrali architektūrai), kalba kuria būtų galima kurti programinę įrangą įvairiausiems elektroniniams įrenginiams, nepriklausomai nuo naudojamų procesorių tipų. Norint to pasiekti, reikėjo kompiliatoriaus, kuris galėtų sukompiliuoti programas visiems procesoriams, tačiau šis sprendimas labai brangus ir užtruktų labai daug laiko. Reikėjo paprastesnio ir ekonomiškesnio sprendimo. Problema buvo išspręsta, negeneruojant programos kodo tiesiai procesoriui, bet programos kodas kompiliuojamas į specialų objektinį kodą, vadinamą baitkodu. Šį kodą toliau skaito ir vykdo Java virtuali mašina (JVM), kurią turi kiekviena kompiuterinė sistema. JVM tai speciali Sun Microsystems firmos programa, parašyta kiekvienai operacinei sistemai atskirai.21 metais sausio 27 d. Sun Microsystems firmą įsigijo Oracle ([2], p. 6). Java kalbos savybės Paprastumas Java buvo sukurta būti lengvai išmokstama ir efektyviai naudojama. Geriausia jei jau turima programavimo patirties su C++, nes Java paveldėjo sintaksę ir objektiškumą iš C ir C++ ([2], p. 11). Saugumas siunčiantis įprastą programą yra rizika, kad programos kode gali būti virusas. Pagrindinė problema, kad virusai gali prieiti prie jūsų kompiuterio resursų. Java programos užtikrina saugumą, nes programos vykdomos Java vykdymo aplinkoje ir neleidžiama prieiti prie kitų kompiuterio dalių ([2], p. 11). Objektiškumas Java nebuvo kuriama suderinta su kitomis kalbomis, todėl kūrėjai turėjo visišką laisvę. Java komanda turėjo savo požiūrį į objektus ir pasirinko geriausias objektines savybes. Neutralumas architektūrai programa parašyta, bet kurioje aplinkoje, tai pat atrodo ir kitose nepriklausomai nuo procesoriaus ir architektūros ([2], p. 11). Mobilumas programa parašyta vienoje operacinėje sistemoje veiks ir kitose ([2], p. 12). Daugiaprocesiškumas Java palaiko daugiasrautį programavimą ([2], p. 12). 6

Java programos veikimas Parašytas programos kodas saugomas faile su plėtiniu.java. Java kalboje labai svarbus failo vardas, Java kompiliatorius reikalauja, kad šaltinio failo vardas sutaptų su klasės vardu. Taip yra todėl, kad šiuo požiūriu Java labai jautri. Tačiau toks failų ir klasių susiejimo būdas padeda lengviau išlaikyti ir organizuoti programas. Java kompiliatorius iš šaltinio failo su plėtiniu.java sukuria failą tokiu pačiu pavadinimu su plėtiniu.class, kuriame programuotojui suprantamas kodas paverčiamas į baitkodą, kurį supranta Java virtuali mašina (JVM). Baitkodas negali būti tiesiogiai vykdomas kompiuteryje. Kompiliuojant programą kompiliatorius tikrina, ar programos kode nėra klaidų, tokių kaip praleisti kabliataškiai, neteisingi kintamųjų vardai, kintamieji naudojami už matomumo srities. Java kompiliatorius netikrina programos veikimo, tai atlieka JVM. Java virtuali mašina baitkodą paverčia į mašininį kodą, kurį supranta procesorius. Tokia sistema teoriškai leidžia tą patį programos kodą vykdyti visose operacinėse sistemose. Kiekvienai operacinei sistemai atskirai yra sukurta JVM, todėl tas pats baitkodas vykdomas vienodai nepriklausomai nuo operacinės sistemos ir procesoriaus architektūros (žr. 1pav. Java programos veikimas). Nepaisant tokio sprendimo, praktikoje visgi atsiranda problemų dėl skirtingų JVM realizacijų, jų defektų arba abstrakčios vartotojo sąsajos nesuderinimo dėl OS specifikos ([2], p. 9). 1pav. Java programos veikimas 7

Java programos kodo kompiliavimas tiesiogiai į mašininį kodą Nuo 26 metų vasario 8 dienos Java programos kodą galima kompiliuoti tiesiai į mašininį kodą. Tais metais buvo išleistas GNU kompiliatoriaus priedas GCJ, leidžiantis kompiliuoti Java programos kodą tiek į baitkodą, tiek ir į mašininį kodą tiesiogiai. Tai suteikia didesnį programos greitį, nei programos kodo kompiliuojant į baitkodą, o tada interpretuojant į mašininį kodą. GCJ 4. versija pristatė daug paprastesnį kūrimo modelį, skirtą perdarinėti tradicines Java programas, sukompiliuojant tiesiai į mašininį kodą, tai leidžia vykdyti programas nenaudojant tarpinio kodo. Šis kompiliatorius buvo pritaikytas Windows, Linux, Mac, Android ir kitoms aplinkoms. Naudojant GCJ kompiliatorių sukompiliuotos tokios programos kaip:eclipce, OpenOffice, Tomcat, Bittorent klientams ir kitos ([11]). Kompiliuojant Java tiesiai į mašininį kodą atsirado galimybė tiesiogiai valdyti aparatinę įrangą. Tai pat atsirado galimybė naudoti bibliotekas parašytas C, C++ ir Assambly kalbomis. Naudojant Java mašininio kodo sąsają JNI (Java Native Interface) programuotojams atsirado galimybė panaudoti metodus spręsti situacijoms, kurių negalėjo išspręsti naudojant standartines Java bibliotekas, dėl naudojamos platformos specifikos. Java programoms, sukompiliuotoms tiesiai į mašininį kodą, nebereikia JRE (Java Runtime Environment). Sukurtas projektas Excelsior JET, kuris Java programas sukompiliuoja tiesiai į mašininį kodą. Projektas Excelsior JET yra pilnai įgyvendintas Java SE 7 versijai. Šis projektas įgyvendintas aplinkoms: Microsoft Windows, Apple OS X ir Linux. Projektas yra mokamas.excelsior JET programos kaina yra $3. Licencija suteikiama neribotam laikui. Toliau programos atnaujinimas kasmet kainuoja $1. Išbandymui galima atsisiųsti pilnai funkcionuojančią bandomąją versiją, kuri veiks devyniasdešimt dienų. Excelsior JET programą galima atsisiųsti adresu: http://www.excelsiorjet.com/#[12]. 8

Darbo pradžia su Java Programavimui Java kalbą būtina atsisiųsti ir įdiegti Java plėtojimo rinkinį (Java development kit JDK), nepriklausomai nuo naudojamos operacinės sistemos (žr. 2 pav. Operacinės sistemos, kuriose veikia JDK). 2 pav. Operacinės sistemos, kuriose veikia JDK Jį galima atsisiųsti šiuo adresu http://www.oracle.com/technetwork/java/javase/downloads/jdk8- downloads-2133151.html. Įdiegus JDK kompiuteryje galima rašyti ir kompiliuoti parašytą Java kodą. Kodą galima rašyti bet kokiame tekstiniame redaktoriuje, o jį sukompiliuoti komandinėje eilutėje, tačiau tai yra nepatogus ir lėtas būdas. Yra sukurta daug Java programavimo aplinkų: Jcreator,http://www.jcreator.com/ NetBeans, https://netbeans.org/ Eclipse, https://eclipse.org/ Jbuilder, http://www.embarcadero.com/products/jbuilder BlueJ, http://www.bluej.org/ Kitos. 9

C# PROGRAMAVIMO KALBA C# programavimo kalbos istorija Microsoft firma 2 metų viduryje išleido pirmąją C# versiją. C# programavimo kalba kilusi iš dviejų sėkmingiausių pasaulyje programavimo kalbų: C ir C++. Vyriausiasis architektas buvo Anders Hejlsberg. Iš C kalbos buvo perimta sintaksė, raktiniai žodžiai ir didžioji dalis operatorių. Objektinio programavimo modelis perimtas iš C++ kalbos. C# tai pat susijusi su kita labai sėkminga programavimo kalba Java ([1], p. 3). C# programavimo kalba buvo kuriama palaikyti.net Framework technologiją..net Framework technologija apibrėžia aplinką, kurioje leidžiama naudoti skirtingų kompiuterinių kalbų bibliotekas, kurios, suteikia saugumo, programos perkeliamumo ir bendro programavimo modelį Windows platformoje ([1], p. 8). Kompiliuojant C# programą generuojama Microsoft tarpinė kalba MSIL (Microsoft Intermediate Language). Microsoft tarpinė kalba suteikia nepriklausomybę nuo procesorių. Microsoft tarpinės kalbos idėja panaši į Java baitkodą, tačiau tai nėra tas pats. Toliau tarpinis kodas verčiamas į vykdomąjį kodą, kurį supranta procesorius. C# kalbos savybės Paprastumas beveik visi profesionalūs programuotojai moka C, C++ arba Java kalbas, neretai jas visas, todėl pereiti prie C# kalbos nekyla jokių sunkumų. Objektiškumas objektiniam programavimui buvo perimtos geriausios struktūrinio programavimo savybės ir papildytos keliomis naujomis idėjomis. Viena svarbiausių savybių mixed-language programming, tai yra galimybė programuojant viena kalba, įtraukti bibliotekas parašytas kitomis kalbomis. Ši savybė suteikia saugumą, mobilumą ir bendrą programavimo modelį Windows platformai. 1

C# programos veikimas Kitaip nei Java kalboje, C# programos kodo failo pavadinimas neturi sutapti su klasės vardu. Kompiliuojant programos kodą nėra gaunamas mašininis kodas, kaip ir Java kalboje. Sukuriamas failas, kuriame patalpinamas specialaus tipo pseudo kodas, vadinamas Microsoft tarpine kalba (Microsoft Intermediate Language) arba MSIL. Iš pirmo žvilgsnio MSIL labai panaši į Java baitkodą, tačiau taip nėra. MSIL skirta.net technologijai. Visos programavimo kalbos priklausančios.net standartui, tokios kaip: VB.NET, J#, C++/CLI ir kitos, yra kompiliuojamos į pseudo kodus, kuriuose skirtingi programų kodai suvienodinami. Tarpinis kodas perduodamas Common Language Runtime ( CRL) sistemai, kuri pseudo kodą paverčia mašininiu kodu. Bet kurioje aplinkoje, kurioje yra įgyvendinta CRL sistema konkrečiai sistemai ir architektūrai gal vykdyti tą patį pseudo kodą (žr. 3 pav. Kalbų priklausančių.net Framework standartui programų veikimas). Ši savybė suteikia programuotojui galimybę nekreipti dėmesio į vartotojo naudojamą įrangą ir suteikia laisvę kurti programas. Perdavus MSIL kodą CRL sistemai, aktyvuojamas JTI (Just In Time) kompiliatorius. JIT kompiliatorius MSIL kodą verčia mašininį kodą dalimis, paverčiama tik ta dalis, kuri reikalinga vykdyti programai šiuo momentu. Tokiu būdu programų veikimo greitis beveik prilygsta programavimo kalboms kaip C++, kurios programos kodą kompiliuoja tiesiai į mašininį kodą. Tai pat tokiu būdu taupoma operatyvioji atmintis [14]. 3 pav. Kalbų priklausančių.net Framework standartui programų veikimas 11

C# programos kodo kompiliavimas tiesiai į mašininį kodą Microsoft firma sukūrė C#.NET Native kompiliatorių, kuris programos kodą sukompiliuoja tiesiai į mašininį kodą. Programos sukompiliuotos naudojant,.net Native kompiliatorių, naudoja 15 2% mažiau atminties, paleidimo laikas sutrumpėja iki 6%. Stabili versija dar nėra sukurta ir nėra skirta produkcijos kūrimui. Šiuo metu platinama versija skirta demonstravimo ir testavimo tikslais. Microsoft firma pabrėžia, jog.net Native būtų naudojama tik virtualiose mašinose arba kompiuteriuose, kurie skirti eksperimentinės įrangos testavimui [17]. Darbo pradžia su C# Norint pradėti programuoti C# kalba Windows aplinkoje nereikia nieko įdiegti, užtenka teksto redaktoriaus. Tereikia sukurti failą su.cs plėtiniu ir jį sukompiliuoti komandinėje eilutėje. Tačiau šis būdas nėra patogus. Yra sukurtos kelios programavimo aplinkos skirtos C# kalbai: Microsoft Visual C#, http://www.visualstudio.com/downloads/download-visual-studio-vs. Microsoft Visual Studio, http://www.visualstudio.com/downloads/download-visual-studio-vs. Microsoft Visual Basic. Mono Develop, http://www.monodevelop.com/. 12

.NET Framework.NET Framework yra platforma, kurią sudaro bibliotekos, kompiliatoriai ir paslaugos (Utilities). Ši platforma naudojama kurti programoms skirtoms Windows, internetui ir interneto paslaugoms (Web Serwesys)..NET platformoje kompiliavimas vyksta dviem etapais. Pirmame etape programos kodas kompiliuojamas į Microsoft tarpinę kalbą (MSIL), kai kur ji tiesiog vadina tarpine kalba (IL). Programuotojas gali pasirinkti bet kurią kalbą, kurią palaiko.net Framework technologija. Šią technologiją palaiko tokios kalbos kaip: C#, C++/CLI, VB, F#, IronPyton ir daug kitų. Kiekviena programavimo kalba turi savo kompiliatorių, kurie parašytos programos kodą paverčia tarpine kalba (IL). Tarpinė kalba suvienodina programavimo kalbų kodus. Pateiktoje lentelėje užrašyti trijų programų fragmentai, atliekantys tuos pačius veiksmus skirtingomis kalbomis (žr. 1 lentelė. Programų kodai). Pirmoje eilutėje sukuriamas tekstinės eilutės kintamasis txt, antroje eilutėje iš klaviatūros nuskaitoma ir priskiriama reikšmė, kintamajam txt. Trečioje eilutėje inicijuojamas sveikojo tipo kintamasis n, ketvirtoje eilutėje tekstinė eilutė paverčiama sveikuoju skaičiumi ir priskiriama kintamajam n. VB C# C++/CLI Dim txt AsString txt = Console.ReadLine Dim n AsInteger n = Integer.Parse(txt) String txt; txt = Console.ReadLine(); int n; n = int.parse(txt); String^ txt; txt = Console::ReadLine(); int n; n = System::Convert::ToInt32(txt); 1 lentelė. Programų kodai Iš pažiūros visi programų kodai skirtingi, tačiau kiekvieną kodą sukompiliavus gaunamas identiškas pseudo kodas. Naudojant tarpinę kalbą (IL), programos kūrėjui nebereikia galvoti apie tai, kokį kompiuterį turi vartotojas, kokią operacinę sistemą naudoja, koks procesorius kompiuteryje. Tarpinis kodas perduodamas Common Language Runtime (CRL) sistemai, kuri atsakinga už tokius veiksmus kaip, šiukšlių surinkimas, pseudo kodo pavertimo į mašininį kodą, atsako už kodo prieinamumo valdymą ir kitas funkcijas. CRL suteikia galimybę prijungti bibliotekas, parašytas kitomis kalbomis. Tam tikslui naudojama bendra duomenų tipų sistema (Common Type System CTS). CTS užtikrina, kad tie patys duomenų tipai skirtingose programavimo kalbose būtų vienodi. Duomenų tipas int iš C# ir duomenų tipas Integer iš VB yra kilę iš duomenų tipo System.Int32 naudojant bendrą tipų 13

sistemą. Tokia duomenų tipų kontrolė užtikrina sklandų komunikavimą tarp skirtingų programavimo kalbų. Į CTS įeina bendra kalbos specifikacija CLS (Common Language Specification). CLS apibrėžia reikalavimus, kurie turi būti užtikrinti visuose programos koduose, norint sujungti kelias programavimo kalbas ([1], p. 9). Mono projektas Mono, tai nemokamas atviro kodo projektas, siekiantis įgyvendinti.net Framework technologiją, leidžiančią kurti programas skirtingoms platformoms. Mono.NET vystymas paremtas ECMA standartu, skirtu C# ir bendrai kalbų infrastruktūrai. ECMA-334 tarptautinis C# standartas, kuriame apibrėžiama C# kalbos sintaksė, apribojimai, nustatytų reikalavimų ribos, semantines taisykles, kurios paaiškina C# programas ([3], p. 5). Projektą parėmė Novell firma, tačiau dabar ją remia firma Xamarin. Mono projektas pasiekė entuziastingą bendruomenę, kuri padėjo toliau vystyti projektą. Mono projektas apima, kūrimo įrankius ir infrastruktūrą, reikalingą vykdyti.net kliento ir serverio programas [13]. Projektą sudarantys komponentai: C# kompiliatorius Mono C# kompiliatorius gali kompiliuoti C# 1., 2., 3., 4. ir 5. versijas, apibrėžtas ECMA standartais Mono darbinė terpė (Runtime) darbinė terpė įgyvendina ECMA bendrų kalbų infrastruktūrą. Pagrindinės klasių bibliotekos Mono platforma teikia visapusišką klasių rinkinį, kuris suteikia tvirtą pagrindą kurti taikomąsias programas. Visos šios klasės suderintos su Microsoft.NET Framework klasėmis. Mono klasių biblioteka Mono tai pat siūlo daug klasių, kurios papildo pagrindines klases. Tai suteikia papildomų funkcijų, kurios yra naudingos, ypač kuriant Linux programas. Keletas klasių pavyzdžių: GTK +, Zip failai, LDAP, OpenGL, Cairo, POSIX ir kitos. Mono palaikomos aplinkos ([3], p. 21): Windows, Linux, OS X, BSD, Soleris. 14

Mono palaikomos procesorių architektūros: X86, X86-64, ARM, S39, PowerPC. Mono projekto trūkumai: Nėra pilnai funkcionuojanti, nes trūksta kai kurių paketų. Dalis paketų dar nestabilūs arba visai neįgyvendinti. Gali būti, kad dalis paketų visai nebus įgyvendinti. 15

Programa C# ir C++/CRL kalbomis Norint išbandyti programų kūrimą, naudojant dvi programavimo kalbas, buvo pasirinktos C# ir C++/CRL kalbos. Programa atlieka trikampio ploto skaičiavimą pagal Herono formulę (žr. 1 formulė. Herono formulė). C# kalba parašyta programos dalis nuskaito duomenis iš failo naudojant srautą. Toliau gauti duomenys perduodami C++/CRL kalba parašytai programos daliai, kuri apskaičiuoja perduoto trikampio plotą, toliau grąžina gautą reikšmę C# kalba parašytai daliai. Didelis trūkumas, jog C# programoje negalima tiesiogiai naudoti sukurtų C++/CRL klasių, negalima sukurti objektų, galima naudoti tik metodus. Tai pat tiesiogiai negalima kreiptis į sukurtus C++/CRL failus, būtina sukurti atskirą DLL failą, kuriame nurodoma, jog C++/CRL programos kodas būtų paruoštas eksportavimui. Tik per šį failą C# programa gali perduoti duomenis ir gauti rezultatus iš C++/CRL programos (žr. 1 programos kodas. DLL failo programos kodas). #include D:\C++ darbai\cppclass\cppclass\header.h #include D:\C++ darbai\cppclass\cppclass\body.cpp extern C declspec(dllexport) double plotas_s(int a, int b, int c) { CppKlase MK(a, b, c); return MK.plotas(); 1 programos kodas. DLL failo programos kodas Kode įtraukiami sukurti C++/CRL failai, toliau užrašoma būtina komanda extern C declspec(dllexport), kuri nurodo, kad įtrauktų programų failų kodai turi būti paruošiami eksportavimui į kitą programavimo kalbą. Toliau sukuriama funkcija su parametrais ir nurodomas jos grąžinamų duomenų tipas. Tarp riestinių skliaustų sukuriamas objektas, kuris konstruktoriui perduoda reikšmes ir grąžinama reikšmė, gauta iš sukurto objekto metodo. C# programai bus matomi tik metodai aprašyti funkcijose, kitu atveju programai jie nebus prieinami, net jei klasėje nurodoma, kad metodas viešas (public). C++/CRL faile header.h sukuriama klasė (žr. 2 programos kodas. Header.h failas). Klasės viduje apibrėžiami uždari sveikojo tipo parametrai ir viešas klasės konstruktorius ir viešas metodas. Pirmoje eilutėje privaloma užrašyti #pragmaonce, norint tą failą naudoti kitose programose. 16

#pragmaonce class CppKlase { public: CppKlase::CppKlase(int a, int b, int c); double plotas(); private: int x; int y; int z; ; 2 programos kodas. Header.h failas Kitame body.cpp faile aprašomi veiksmai, kuriuos atliks header.h faile deklaruotas metodas ir konstruktorius (žr. 3 programos kodas. Body.cpp failas). Į kodą būtina įterpti header.h failą. Konstruktoriuje globaliems sveikojo tipo kintamiesiems priskiriamos reikšmės, kurios buvo perduodamos sukūrus objektą. Metode plotas() patikrinamos perduotos trikampio kraštinės, jeigu jos sudaro trikampį, tuomet apskaičiuojamas trikampio plotas. C# programai grąžinamas trikampio plotas, jei sąlyga patenkinama arba -1, jei sąlyga netenkinama. #pragmaonce #include<math.h> #include header.h CppKlase::CppKlase(int a, int b, int c) { x = a; y = b; z = c; double CppKlase::plotas() { double p = (x + y + z)/2.; double S; if((x + y) > z && (x + z) > y && (y + z) > x ) { S = sqrt(p * (p x) * (p y) * (p z)); Else { S = -1; return S; 3 programos kodas. Body.cpp failas 17

Norint jau sukurtą C++/CRL programą panaudoti, C# programoje būtina įkelti klasę System.Runtime.InteropServices, kuri leidžia C# programoje naudoti.dll failus. Toliau būtina importuoti.dll failą. Šiam darbui naudojama funkcija [DllImport( D:\\C++ darbai\\dll_failas\\ Debug\\DLL_failas.dll, CallingConvention = CallingConvention.Cdecl)], funkcijos parametruose nurodomas kelias iki DLL_failas.dll failo ir parametras, skirtas subalansuoti prisijungimą. Toliau būtina užrašyti publicstaticextern ir nurodomas metodas apibrėžtas.dll faile. Nurodomi parametrai skirti metodui ir grąžinamų duomenų tipui. Toliau tokį metodą galima naudoti kaip paprastą metodą (žr. 4 programos kodas. C# kodas). using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Runtime.InteropServices; namespace Csharp_Cpp { Class Program { [DllImport( D:\\C++ darbai\\dll_failas\\debug\\dll_failas.dll, CallingConvention = CallingConvention.Cdecl)] publicstaticexterndouble plotas_s(int a, int b, int c); staticvoid Main(string[] args) { int a = 5; int b = 4; int c = 3; double S = plotas_s(a, b, c); 4 programos kodas. C# kodas Toks skirtingų programavimo kalbų naudojimas vienai programai galimas tik Windows aplinkoje. Nemokamas atviro kodo projektas Mono nepalaiko ir nebus kuriama C++/CLI, nes tam sukurti reikia daug išteklių, o vartotojų, kurie galėtų tuo naudotis, nėra daug. 18

Duomenų tipai Java paprastieji duomenų tipai Duomenų tipas Dydis atmintyje Reikšmių sritis Sveikųjų skaičių duomenų tipai byte 8 bitai nuo -128 iki 127 short 16 bitų nuo -32768 iki 32767 int 32 bitai nuo -2 31 iki 2 31-1 long 64 bitai nuo -2 63 iki 2 63-1 Realiųjų skaičių duomenų tipai float 32 bitai nuo-3.4e 38 iki 3.4e+38 double 64 bitai nuo±4.9e 324 iki ±1.8e+38 Loginis duomenų tipas boolean 1 bitas True arba false Simbolinis duomenų tipas cher 16 bitų 65 535 simboliai Vardinis duomenų tipas enum 2 lentelė. Paprastieji Java duomenų tipai C# paprastieji duomenų tipai Duomenų tipas Dydis atmintyje Reikšmių sritis Sveikųjų skaičių duomenų tipai byte 8 bitai nuo iki 255 sbyte 8 bitai nuo -128 iki 127 short 16 bitų nuo -32768 iki 32767 ushort 16 bitų nuo iki 65535 int 32 bitai nuo -2 31 iki 2 31-1 uint 32 bitai nuo iki 4,294,967,295 long 64 bitai nuo -2 63 iki 2 63-1 ulong 64 bitai nuo iki 2 64 Realiųjų skaičių duomenų tipai float 32 bitai nuo-3.4e 38 iki 3.4e+38 double 64 bitai nuo ± 4.9e 324 iki ±1.8e+38 decimal 128 bitai nuo 1e 28 iki 7.9e+28 Loginis duomenų tipas bool 1 bitas True arba false Simbolinis duomenų tipas cher 16 bitų 65 535 simboliai Vardinis duomenų tipas enum 3 lentelė. Paprastieji C# duomenų tipai C# turi daugiau sveikųjų duomenų tipų, nei Java. Visi sveikųjų duomenų tipai esantys Java yra ir C# kalboje, tačiau C# papildyta analogiškais duomenų tipais, kurie skiriasi tik reikšmių sritimi (žr. 2 19

lentelė. Paprastieji Java duomenų tipai, 3 lentelė. Paprastieji C# duomenų tipai). Papildomi sveikųjų duomenų tipai skaičių saugojimui naudoja tą patį atminties kiekį, tačiau juose nėra saugomi neigiami skaičiai. C# turi daugiau realiųjų duomenų tipų, nei Java kalba. Abejose kalbose naudojami float ir double duomenų tipai turi tas pačias savybes, tokias kaip reikšmių sritys ir naudojamas atminties dydis skaičiaus talpinimui. C# turi papildomą decimal duomenų tipą, skirtą saugoti realiuosius skaičius. Šiam duomenų tipui skiriami 128 bitai, tačiau jo reikšmių sritis mažesnė, nei float duomenų tipo, nors jam skiriamas tik 32 bitai. Taip yra todėl, kad šis duomenų tipas gali saugoti 28 simbolius po kablelio. Toks tikslumas naudojamas norint išvengti skaičių apvalinimo paklaidų, kurios atsiranda naudojant kitus realiųjų skaičių duomenų tipus. Dažniausiai šis duomenų tipas naudojamas piniginėse operacijose, dėl savybės išvengti apvalinimo paklaidų. Java ir C# kitaip nei kitos programavimo kalbos, kaip C, C++ ir daugelis kitų simbolių, kodavimui nenaudoja 8 bitų. Abejose kalbose simboliams skiriama 16 bitų, kitaip dar vadinamas Unikodu. C#sudėtingieji duomenų tipai Java sudėtingieji duomenų tipai Tipas Paaiškinimas Tipas Paaiškinimas array masyvas array masyvas String simbolių eilutė String simbolių eilutė class klasė Class klasė interface sąsaja Interface sąsaja delegate delegatas 5 lentelė. Sudėtingieji Java duomenų tipai struct struktūra 4 lentelė. Sudėtingieji C# duomenų tipai Abejose programavimo kalbose naudojami tokie patys sudėtingieji duomenų tipai, kaip masyvai, simbolių eilutės arba simbolių masyvai, klasės, sąsajos. Tačiau C# turi papildomus du sudėtinguosius duomenų tipus delegate ir struct. Duomenų tipas delegate skirtas funkcijų inkapsuliacijai. Java kalboje struktūros tipas realizuojamas naudojant klases (žr. 4 lentelė. Sudėtingieji C# duomenų tipai, 5 lentelė. Sudėtingieji Java duomenų tipai). Inkapsulecija tai saugus metodas klasės laukus padaryti neprieinamus kitoms klasėms. Taip gaunamas juodos dėžės principas, kai objektui perduodami parametrai, bet nežinoma kaip klasėje viskas realizuota. Delegatas yra saugi funkcijų rodyklė. Naudojant delegatą galima kreiptis į bet kurią to paties tipo funkciją su vienodais parametrais, naudojant tą patį delegate objektą. Java kalboje nėra tokio duomenų tipo. Inkalsulecija Java kalboje realizuojama naudojant klases. 2

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Delegatas{ public delegate void Vaiksmas(int a, int b); class Program{ static void Main(string[] args) { Vaiksmas delegatas = new Vaiksmas(sudetis); delegatas(5, 5); delegatas = new Vaiksmas(atimtis); delegatas(5, 5); delegatas = new Vaiksmas(daugyba); delegatas(5, 5); delegatas = new Vaiksmas(dalyba); delegatas(5, 5); Console.Read(); Static void sudetis(int x, int y) { Console.WriteLine(x + + + y + = + (x + y)); Static void atimtis(int x, int y) { Console.WriteLine(x + + y + = + (x y)); Static void daugyba(int x, int y) { Console.WriteLine(x + * + y + = + (x * y)); Static void dalyba(int x, int y) { Console.WriteLine(x + / + y + = + (x / (double)y)); 5 programos kodas. Delegato naudojimas 21

Matematiniai skaičiavimo paketai Naudojant Java programavimo kalbą sukurta daug programų skaičiavimams ir duomenų apdorojimui. ND4J matematinis paketas algebriniams ir matricinėms skaičiavimams. Matlab matematinis paketas skirtas skaičiavimams su matricomis, funkcijų braižymui, algoritmų įgyvendinimui. ScaViS sistema duomenų tirybai ir vizualizavimui. Scilab nemokamas atviro kodo matematinis paketas inžineriniams ir moksliniams darbams. COMSOL Multiphysics fizikinis paketas modeliavimui ir simuliavimui. Mathematica simbolinė matematinė sistema, moksliniams ir inžineriniams skaičiavimams. Maple matematinis paketas inžineriniams ir moksliniams tyrimams. Baudline paketas signalų analizei. Dataplot duomenų analizės ir vizualizavimo, prognozavimo paketas. EJS arba Easy Java Simulations paketas interaktyvioms simuliacijoms. ELKI paketas duomenų gavybai. Sherlock Automated Design Analysis sistema skirta elektronikos projektavimui, testavimui ir tikrinti patikimumą. Naudojant Microsoft C# programavimo kalbą nebuvo rasta programų skaičiavimams ar duomenų tyrimui. Naudojant nemokamą atviro kodo projektą Mono C# sukurti trys matematiniai paketai skirti matematiniams skaičiavimams. Math.NET Numerics matematinis paketas inžineriniams ir moksliniams tyrimams. ILNumeric.NET matematinis paketas inžineriniams ir moksliniams tyrimams ir vizualizavimui. 22

DnAnalytics papildomai prijungiama sistema prie Math.NET Numerics, kuri išplečia apdorojamų duomenų kiekį, prideda papildomų galimybių. Naudojant Mono C# parašytos programos veikia daugelyje platformų, kaip ir parašytos programos su Java. COMSOL Multiphysics yra baigtinių elementų analizės ir modeliavimo programinė įranga, skirta įvairių fizikos ir inžinerijos reiškinių modeliavimui ir imitacijai, visų pirma, susietųjų ir pereinamųjų procesų ir sistemų analizei pasitelkiant modeliavimui reikiamus modulius. COMSOL Multiphysics gali dirbti naudojant lygiagrečiuosius skaičiavimus. Palaikomos tiesioginės sąsajos su šiomis programomis: MATLAB, MS Excel, SolidWorks, SpaceClaim, Inventor, AutoCAD, Creo TM Parametric, Pro/ENGINEER, SolidEdge. Nors Comsol Multiphysics turi tiesioginių sąsajų su populiariausiomis projektavimo programomis, tačiau yra galimybė kurti modelius ir šioje programoje. 23

EKSPERIMENTINĖ DARBO DALIS Naudojama kompiuterinė ir programinė įranga Naudojamas kompiuteris Dell Inspirion 15. Kompiuterio parametrai: Procesorius Intel Celeron 117U 1,6Ghz. Operatyvioji atmintis 2GB DDR-16. Kietasis diskas 32GB 54rpm. Naudojamos operacinės sistemos: Windows 7 Ultimate 32bit toliau vadinama Windows. Ubuntu 14.4 LTS 32bit toliau vadinamalinux. Laiko skaičiavimas Visų eksperimentų vykdymo laikai buvo matuojami specialiais metodais, kai darbo laikas gaunamas suskaičiavus procesoriaus darbo taktus. Tokiu būdu gaunamas labai tikslus programos veikimo laikas. C# programavimo kalboje naudojama klasė Stopwatch. Klasė įtraukiama į projektą naudojant using System.Diagnostics;. Sukuriamas naujas objektas Stopwatch timer = newstopwatch(). Naudojant metodą Start() objektas pradeda skaičiuoti procesoriaus taktus. Su metodu Stop() objektas sustabdomas. Rezultatą galima gauti naudojant parametrus ElapsedTicks, reikšmė yra atliktų procesoriaus taktų skaičius arba naudojant parametrą ElapsedMilliseconds, kurio reikšmė procesoriaus taktų skaičius išreikštas milisekundėmis. Java programavimo kalboje taip pat naudojama panaši klasė StopWatch. Tačiau tai nėra standartinė klasė, todėl reikia atsisiųsti commons-lang3-3..jar failą, jį galima rasti šiuo adresu https://commons.apache.org/proper/commons-lang/download_lang.cgi.toliau įtraukti.jar failą į projektą ir importuoti klasę import org.apache.commons.lang3.time.stopwatch;. Sukuriamas naujas objektas StopWatch timer = new StopWatch(). Naudojami tokie patys metodai Start()ir Stop() matavimui pradėti ir sustabdyti. Programos vykdymo laiką galima gauti procesoriaus taktais ir milisekundėmis naudojant metodus getnanotime() ir gettime(). 24

Paprastų matematinių operacijų greičiai Atliekami pagrindiniai keturi veiksmai su sveikaisiais ir su realiaisiais skaičiais. Skaičiavimai atliekami dešimt milijonų kartų. Eksperimentai atliekami Windows aplinkoje naudojant Java ir C# ir Linux aplinkoje naudojant Java ir Mono C#. Su sveikaisiais kintamaisiais atliekamos sudėties, atimties, daugybos ir dalybos, kai gaunama tik sveikoji dalis, operacijos. Atliekant eksperimentus su dalybos veiksmu, kai gaunamos liekanos, laikai praktiškai identiški, todėl jų rezultatai neįtraukiami į diagramą (žr. 1 diagrama. Veiksmai su int tipo duomenimis). Java programavimo kalba atlieka skaičiavimus greičiau, nei C# programavimo kalba atliekant tas pačias operacijas (žr. 6 programos kodas. Operacijos su sveikojo tipo kintamaisiais). Tačiau greičiausiai su sveikaisiais skaičiais operacijos atliekamos Java Linux aplinkoje. Vienintelė Java dalybos operacija, kai gaunama sveikoji dalis Windows aplinkoje atliekama panašiu greičiu, kaip ir C# kalboje. Microsoft sukurtas C# ir nemokamas atviro kodo projektas Mono C# skaičiavimus atlieka panašiu greičiu, tačiau nemokama versija nežymiai, bet lenkia Microsoft C#. Milisekundės 8 69 64 57 6 Java (Windows) 48 4 4 42 4 39 C# (Windows) 4 Java (Linux) 17 2 13 9 1 12 8 C# (Linux) 6 sudetis atimtis daugyba dalyba Veiksmai 1 diagrama. Veiksmai su int tipo duomenimis Java C# inta;int b = 2; double n = 2, x1; int k = 1; StopWatch timer = new StopWatch(); timer.start(); for (int i = 1; i <= k; i++) { a = b + i; int a;int b = 2; double n = 2,x1; int k = 1; Stopwatch timer = new Stopwatch(); timer.start(); for (int i = 1; i <= k; i++) { a = b + i; 25

timer.stop(); timer.stop(); 6 programos kodas. Operacijos su sveikojo tipo kintamaisiais Atliekant operacijas su realiaisiais skaičiais, labiausiai išsiskiria Java Linux aplinkoje. Sudėties veiksmai vidutiniškai atliekami apie septynis kartus greičiau, nei C# abejose tirtose aplinkose ir Java Windows aplinkoje, nors programų kodai identiški (žr. 7 programos kodas. Operacijos su realiojo tipo kintamaisiais). Java, ir C# aritmetinės operacijos atliekamos greičiau Linux aplinkoje. Daugybos operacija Java Linux aplinkoje vidutiniškai dešimt kartų greičiau, nei visose kitose aplinkose. Daugiausiai laiko užima Java dalybos operacija Windows aplinkoje (žr. 2 diagrama. Veiksmai su double tipo duomenimis). C# Windows ir Linux aplinkose dideliu greičio skirtumu nepasižymi, išskyrus atimties operaciją. Atliekant šią operaciją Mono C# du kartus greičiau atliko identiškas užduotis. Milisekundės 1 83 8 Java (Windows) 6 46 51 46 51 47 51 51 51 C# (Windows) 38 38 4 Java (Linux) 18 2 6 5 5 8 C# (Linux) sudetis atimtis daugyba dalyba Veiksmai 2 diagrama. Veiksmai su double tipo duomenimis Java C# int a; int b = 2; double n = 2, x1; int k = 1; int a; int b = 2; double n = 2,x1; int k = 1; StopWatch timer = new StopWatch(); timer.start(); Stopwatch timer = new Stopwatch(); timer.start(); for (int i = 1; i <= k; i++) { for (int i = 1; i <= k; i++) { 26

x1 = n + (double)i; timer.stop(); x1 = n + (double)i; timer.stop(); 7 programos kodas. Operacijos su realiojo tipo kintamaisiais Duomenų skaitymas iš failo naudojant srautus Pirmoje failo eilutėje buvo įrašomas eilučių su duomenimis skaičius. Kiekvienoje eilutėje įrašyti trys sveikieji skaičiai. Skaičiai kiekvienoje eilutėje apibrėžia kvadratinės lygties koeficientus a, b ir c. Skaičiai atsitiktinai generuojami iš intervalo [-1; 1]. Failų pavyzdžiai Windows aplinkoje (žr. 4 pav. Duomenų failas Windows aplinkoje)ir Linux aplinkoje (žr. 5 pav. Duomenų failas Linux aplinkoje). 4 pav. Duomenų failas Windows aplinkoje 5 pav. Duomenų failas Linux aplinkoje Lentelėje pateikti gauti rezultatai milisekundėmis nuskaitant atitinkamą duomenų kiekį, naudojant srautą (stream) (žr. 6 lentelė. Duomenų skaitymo iš tekstinių failų laikai). Duomenų kiekis 1 2 5 1 2 5 1 2 Java (Windows) 8 12 132 18 165 379 525 1996 Java (Linux) 51 116 19 181 21 78 1246 264 C# (Windows) 32 28 26 43 7 261 464 174 C# (Linux) 37 49 83 11 25 56 176 2135 6 lentelė. Duomenų skaitymo iš tekstinių failų laikai Iš gautų rezultatų matyti, kad Windows aplinkoje C# programoje duomenų nuskaitymas iš failų vykdomos greičiausiai. Lėčiausiai Linux aplinkoje Java programoje (žr. 3 diagrama. Duomenų 27

skaitymas iš failų naudojant srautus). Tačiau iki dviejų šimtų tūkstančių eilučių skaitymo iš failų greičiai panašūs. 3 25 Milisekundės 2 15 1 5 Java (Windows) Java (Linux) C# (Windows) C# (Linux) 5 1 15 2 Duomenų kiekis 3 diagrama. Duomenų skaitymas iš failų naudojant srautus Java kalba parašytų programų gauti rezultatai rodo, kad Windows 7operacinėje sistemoje duomenų nuskaitymas iš failų atliekamas greičiau, nei Ubuntu 14.4LTS operacinėje sistemoje (žr. 4 diagrama. Java duomenų skaitymo iš tekstinių failų). Vienintelis skirtumas Java kode yra kelio iki failo adreso užrašymas (žr. 8 programos kodas. Java duomenų skaitymas iš tekstinių failų), kitų skirtumų nėra. Iki dviejų šimtų tūkstančių eilučių abejose operacinėse sistemos duomenų nuskaitymo greitis panašus, tačiau viršijus šį kiekį, Linux aplinkoje programa ima atsilikti. Windows BufferedReader fin;... fin = new BufferedReader(new FileReader( D:/Rezultatai (Windows)/ + pavadinimas +.txt ));... ns = fin.readline();... for(int g = ; g<n;g++){ eil[g] = fin.readline(); fin.close(); Linux BufferedReader fin;... fin = new BufferedReader(new FileReader( /home/kompas/c# darbai/ + pavadinimas +.txt ));... ns = fin.readline();... for(int g = ; g<n;g++){ eil[g] = fin.readline(); fin.close(); 8 programos kodas. Java duomenų skaitymas iš tekstinių failų 28

Milisekundės 3 25 2 15 1 5 5 1 15 2 Duomenų kiekis 4 diagrama. Java duomenų skaitymo iš tekstinių failų greitis Windows Linux C# kalba parašytos programos duomenų nuskaitymas operacinėje sistemoje Ubuntu 14.4LTS vykdomas lėčiau, naudojant nemokamą ir atviro kodo projektą Mono, skirtą įgyvendinti.net Framwork technologiją. Operacinėje sistemoje Windows 7 Ultimate C# duomenų nuskaitymas vykdomas greičiau (žr. 5 diagrama. C# duomenų skaitymo iš tekstinių failų greitis). Windows Linux using (System.IO.StreamReader failas using (System.IO.StreamReader failas = new = new System.IO.StreamReader( D:/Rezultatai/ + System.IO.StreamReader( /home/kompas/c# pavadinimas +.txt )) darbai/ + pavadinimas +.txt ))...... pr = failas.readline(); pr = failas.readline();...... for(int i = ; i<n; i++) for(int i = ; i<n; i++) { { eil[i] =failas.readline().split( ); eil[i] =failas.readline().split( );...... failas.close(); failas.close(); 9 programos kodas. C# duomenų skaitymas iš tekstinių failų Tiek Windows tiek Linux aplinkose programų kodai nesiskiria. Vienintelis skirtumas adresas iki failo (žr. 9 programos kodas. C# duomenų skaitymas iš tekstinių failų). 29

25 2 Milisekundės 15 1 5 5 1 15 2 Windows Linux Duomenų kiekis 5 diagrama. C# duomenų skaitymo iš tekstinių failų greitis Windows ir Linux aplinkose Java programų vykdymų greičiai atsilieka nuo C# programų skaitant duomenis iš failų (žr. 6 diagrama. Duomenų skaitymo iš falų greitis Windows aplinkoje, 7 diagrama. Duomenų skaitymo iš falų greitis Linux aplinkoje). 25 Milisekundės 2 15 1 Java 5 C# 5 1 15 2 Duomenų kiekis 6 diagrama. Duomenų skaitymo iš falų greitis Windows aplinkoje 3 25 Milisekundės 2 15 1 5 Java C# 5 1 15 2 Duomenų kiekis 7 diagrama. Duomenų skaitymo iš falų greitis Linux aplinkoje 3

Trikampių plotų skaičiavimas Matematinių skaičiavimų palyginimui buvo pasirinkta Herono formulė (žr. 1 formulė. Herono formulė), trikampio plotui apskaičiuoti. Lentelėje pateikta: duomenų kiekis, programavimo kalba ir operacinė sistema, kurioje buvo atliekami bandymai. Duomenų kiekis trikampių kiekis, kurių plotas apskaičiuojamas. Ties kiekviena programavimo kalba ir operacine sistema nurodomas laikas, kurį užtruko programos, atlikdamos skaičiavimus milisekundėmis (žr. 7 lentelė. Trikampių plotų skaičiavimų laikai milisekundėmis). Duomenų kiekis 1 2 5 1 2 5 1 2 Java (Linux) 18 19 34 31 41 4 62 115 Java (Windows) 15 21 22 24 28 35 48 76 C# (Linux) 1 2 6 11 24 61 122 31 C# (Windows) 2 5 8 16 29 72 142 275 7 lentelė. Trikampių plotų skaičiavimų laikai milisekundėmis = ( ) ( ) ( ) 1 formulė. Herono formulė Pateikiamos abiejų kalbų Java ir C# programų kodų dalys, apskaičiuojančios nurodyto kiekio trikampių plotus (žr. 1 programos kodas. Trikampių plotų skaičiavimas). Java C# for(int i = ; i < n; i++){ if((sk[i][]+sk[i][1] > sk[i][2]) &(sk[i][2]+sk[i][1] > sk[i][]) & (sk[i][]+sk[i][2] > sk[i][1])){ p = (sk[i][] + sk[i][1] + sk[i][2]) / 2.; S[i] = Math.sqrt(p * (p sk[i][]) * (p sk[i][1]) * (p sk[i][2])); else{ S[i] = -1; for(int i = ; i < n; i++) { if ((sk[i, ] + sk[i, 1] > sk[i, 2]) & (sk[i, 2] + sk[i, 1] > sk[i, ]) & (sk[i, ] + sk[i, 2] > sk[i, 1])) { p = (sk[i, ] + sk[i, 1] + sk[i, 2])/2.; S[i] = Math.Sqrt(p * (p sk[i,]) * (p sk[i,1]) * (p sk[i,2])); else { S[i] = -1; 31

1 programos kodas. Trikampių plotų skaičiavimas Java programos kodas identiškas abejose tirtose operacinėse sistemose: Windows ir Linux. C# programos kodai nesiskiria Windows ir Linux aplinkose. Palyginus Java ir C# kodus skirtumų beveik nėra, vienintelis skirtumas dvimačio masyvo elementų indeksų užrašymas. Java kalboje dvimačiai masyvo indeksai užrašomi atskiriant tarp laužtinių skliaustų, sk[ i ][ ]. C# programavimo kalboje dvimačiai masyvo indeksai užrašomi tarp vienos laužtinių skliaustų poros, indeksus atskiriant kableliu, sk[ i, ]. Milisekundės 35 3 25 2 15 1 5 5 1 15 2 Duomenų kiekis Java (Windows) Java (Linux) C# (Linux) C# (Windows) 8diagrama. Trikampių plotų skaičiavimo pagal Herono formulę greitis Matematinius veiksmus, kai trikampių kiekis mažesnis nei du šimtai tūkstančių trikampių, greičiau atlieka programos parašytos C# kalba Windows ir Linux aplinkose. Tačiau duomenų kiekiui esant tarp dviejų ir trijų šimtų tūkstančių C# ir Java programų sprendimų laikai išsilygina, o viršijus šį kiekį C# pradeda atsilikinėti (žr. 8diagrama. Trikampių plotų skaičiavimo pagal Herono formulę greitis). Milisekundės 3 25 2 15 1 5 5 1 15 2 Duomenų kiekis Java C# 9 diagrama. Trikampių plotų skaičiavimo Windows aplinkoje pagal Herono formulę greitis 32

Windows aplinkoje C# pirmauja prieš Java atliekant skaičiavimus pagal Herono formulę iki dviejų šimtų tūkstančių trikampių. Esant tokiam duomenų kiekiui C# programa dviejų šimtų tūkstančių trikampių plotus apskaičiuoja per 29ms, o Java programa apskaičiuoja per 28ms. Toliau didėjant duomenų kiekiui Java daro vis didesnį atotrūkį nuo C#(žr. 9 diagrama. Trikampių plotų skaičiavimo Windows aplinkoje pagal Herono formulę greitis). Milisekundės 35 3 25 2 15 1 5 5 1 15 2 Duomenų kiekis Java C# 1 diagrama. Trikampių plotų skaičiavimolinux aplinkoje pagal Herono formulę greitis Linux aplinkoje nemokamas atviro kodo projektas Mono C# atlieka skaičiavimus greičiau esant iki trijų šimtų tūkstančių trikampių, trikampių plotų apskaičiavimas atliekamas per 27ms. Java kalba parašyta programa tą patį kiekį apskaičiuoja per 22ms. Padidinus trikampių kiekį geresnius rezultatus rodo Java (žr. 1 diagrama. Trikampių plotų skaičiavimolinux aplinkoje pagal Herono formulę greitis). Milisekundės 35 3 25 2 15 1 5 5 1 15 2 Duomenų kiekis Linux Windows 11 diagrama. Trikampių plotų skaičiavimo C# kalba pagal Herono formulę greitis C# kalba parašytos programos skaičiavimus atlieka panašiu greičiu. Tačiau nemokamas atviro kodo projektas Mono C# matematinius veiksmus atlieka nežymiai greičiau ir tik pasiekus pusantro 33

milijono trikampių kiekį Microsoft C# Windows aplinkoje pasiveja nemokamą Mono C# Linux aplinkoje (žr. 11 diagrama. Trikampių plotų skaičiavimo C# kalba pagal Herono formulę greitis). Toliau didinant duomenų kiekį Microsoft firmos C# atlieka skaičiavimus greičiau. Milisekundės 14 12 1 8 6 4 2 5 1 15 2 Duomenų kiekis Linux Windows 12 diagrama. Trikampių plotų skaičiavimo Java kalba Herono formulę greitis Java programos tiek Windows, tiek Linux aplinkose trikampių plotus apskaičiuoja apylygiai iki dvidešimties tūkstančių trikampių. Viršijus šį kiekį Windows aplinkoje Java trikampių plotus apskaičiuoja greičiau nei Linux aplinkoje (žr. 12 diagrama. Trikampių plotų skaičiavimo Java kalba Herono formulę greitis). 34

Kvadratinių lygčių sprendimas Matematinių skaičiavimų palyginimui buvo pasirinktas kvadratinių lygčių sprendimas, kai randami taškai, kuriuose funkcijos grafikas kerta x ašį. Lentelėje pateikta: duomenų kiekis, programavimo kalba ir operacinė sistema, kurioje buvo atliekami bandymai. Duomenų kiekis kvadratinių lygčių, kurių reikšmės apskaičiuotos. Ties kiekviena programavimo kalba ir operacine sistema nurodomas laikas, kurį užtruko programos, atlikdamos skaičiavimus milisekundėmis (žr. 8 lentelė. Kvadratinių lygčių sprendimų laikai milisekundėmis). Duomenų kiekis 1 2 5 1 2 5 1 2 Java (Windows) 167 121 312 612 1171 3932 6844 Java (Linux) 184 316 352 528 795 213 493 13681 C# (Windows) 23 3 76 185 391 98 22 4217 C# (Linux) 18 33 78 15 315 84 159 364 8 lentelė. Kvadratinių lygčių sprendimų laikai milisekundėmis Iš pateiktų duomenų matyti, kad Windows aplinkoje nėra Java parašytos programos apskaičiuojančios kvadratines lygtis sprendimo laiko, kai lygčių kiekis du milijonai. Rezultatai negaunami, nes nepakanka operatyvios atminties (žr. 6 pav. Java klaida, kai nepakanka operatyvios atminties). 6 pav. Java klaida, kai nepakanka operatyvios atminties Java programoms leidžiama naudoti ribotą atminties kiekį. Apribojimai apibrėžiami paleidžiant programą. Java atmintį padalina į dvi atskiras dalis. Dalys vadinamos heap ir permgen. Permgen dalyje saugomos naudojamos klasės, kurių objektai yra inicijuoti. Abiejų dalių dydį nustato Java virtuali mašina (JVM) apibrėždama parametrus XmxirXX: MaxPermSize, jeigu jie nėra nustatomi, Java nustatys konkrečius parametrus pagal nutylėjimą. Kompiuteryje gali būti užtektinai operatyviosios atminties, tačiau jei heap dalies dydis mažesnis nei reikia programos veikimui, tuomet atsiranda klaida dėl nepakankamo atminties kiekio. 35

Galima pasitikrinti heap dalies dydį, kurią pagal nutylėjimą priskyrė JVM (žr. 7 pav. Nustatytas ir maksimalus heap dalies dydis). Komandų lauke užrašius komandą Javaw XX:+PrintFlagsFinal find InitialHeapSize. Norint sužinoti maksimalų heap dalies dydį, komandų lauke užrašyti komandą Javaw XX:+PrintFlagsFinal find MaxHeapSize(žr. 7 pav. Nustatytas ir maksimalus heap dalies dydis). 7 pav. Nustatytas ir maksimalus heap dalies dydis Norint galima pakeisti heap dalies dydį per valdymo skydą (Control Panel). Surasti Java nuorodą (žr. 8 pav. Java nuoroda). Atsivėrusiame lange (žr. 9 pav. Java Control Panel) pasirinkti Java etiketę ir spausti mygtuką View.... 8 pav. Java nuoroda 9 pav. Java Control Panel Naujame lange (žr. 1 pav. Atminties kiekio nustatymas) nurodoma kiek atminties norima skirti: Xms512m priskiria 512MB atminties. Xms124m priskiria 1GB atminties. Xms248m priskiria 2GB atminties. Xms372m priskiria 3GB atminties. 36

Įvedus norimą kiekį spaudžiama OK. 1 pav. Atminties kiekio nustatymas Iš diagramų matyti, kad lėčiausiai skaičiavimai atliekami Java kalba parašytoje programoje Windows aplinkoje. Greičiausiai rezultatai gaunami C# kalba parašytoje programoje Linux aplinkoje (žr. 13 diagrama. Kvadratinių lygčių sprendimo greitis).šie rezultatai prieštarauja rezultatams, gautiems skaičiuojant trikampių plotus pagal Herono formulę. Taip atsitiko, nes į lygčių skaičiavimo kodą buvo įrašyti veiksmai su tekstinėmis eilutėmis. Kai tos pačios lygtys apskaičiuojamos neatliekant veiksmų su tekstinėmis eilutėmis, gaunamas analogiškas rezultatas kaip ir trikampių plotų uždavinyje. 16 14 12 Milisekundės 1 8 6 4 2 5 1 15 2 Java (Windows) Java (Linux) C# (Windows) C# (Linux) Duomenų kiekis 13 diagrama. Kvadratinių lygčių sprendimo greitis Pateiktose Java kvadratinių lygčių sprendimo koduose matyti, kad jie identiški tiek Windows, tiek Linux aplinkose (žr. 11 programos kodas. Java kvadratinių lygčių sprendimas). Nepaisant to, kad programos kodas vienodas ir rezultatai gaunami identiški, skaičiavimų laikai skiriasi (žr. 14 diagrama. Java kvadratinių lygčių sprendimo greitis). Kai sprendimų kiekis iki šimto tūkstančių, Java programa vykdoma greičiau Windows aplinkoje, tačiau viršijus šį kiekį pranašesnė programa veikianti Linux aplinkoje. Linux aplinkoje Java skiria daugiau operatyviosios atminties heap dalyje, todėl galima atlikti skaičiavimus su didesniu duomenų kiekiu. 37

Windows for(int i = ; i<n; i++){ D = sk[i][1]*sk[i][1]-4*sk[i][]*sk[i][2]; if(d>=){ x1 = (-1 * sk[i][1] Math.sqrt(D)) / (2 * sk[i][]); x2 = (-1 * sk[i][1] + Math.sqrt(D)) / (2 * sk[i][]); lygtis[i] += x1= + x1 +, x2= + x2; elseif (D<) { lygtis[i] +=, Lygtis neturi sprendiniu ; Linux for(int i = ; i<n; i++){ D = sk[i][1]*sk[i][1]-4*sk[i][]*sk[i][2]; if(d>=){ x1 = (-1 * sk[i][1] Math.sqrt(D)) / (2 * sk[i][]); x2 = (-1 * sk[i][1] + Math.sqrt(D)) / (2 * sk[i][]); lygtis[i] += x1= + x1 +, x2= + x2; elseif (D<) { lygtis[i] +=, Lygtis neturi sprendiniu ; 11 programos kodas. Java kvadratinių lygčių sprendimas 15 Milisekundės 1 5 Linux Windows 5 1 15 2 Duomenų kiekis 14 diagrama. Java kvadratinių lygčių sprendimo greitis 38

Pateiktuose C# kvadratinių lygčių sprendimų koduose matyti, kad jie identiški tiek Windows, tiek Linux aplinkose (žr. 12 programos kodas. C# kvadratinių lygčių sprendimas). Nors Windows aplinkoje naudojamas oficialus Microsoft firmos sukurtas C# standartas, Linux aplinkoje naudojamas nemokamas atviro kodo standartas, tačiau abiejų standartų skaičiavimo laikai praktiškai vienodi (žr. 15 diagrama. C#kvadratinių lygčių sprendimo greitis). Sprendimo greičiai pradeda skirtis pasiekus vieną milijoną kvadratinių lygčių. Kitaip nei Java, C# naudoja visą galimą operatyvinę atmintį. Windows for(int i = ; i<n; i++){ D = sk[i,1]*sk[i,1]-4*sk[i,]*sk[i,2]; if(d>=) { x1 = (-1 * sk[i,1] Math.Sqrt(D)) / (2 * sk[i,]); x2 = (-1 * sk[i,1] + Math.Sqrt(D)) / (2 * sk[i,]); lygtis[i] += x1= + x1 +, x2= + x2; elseif (D<) { lygtis[i] +=, Lygtis neturi sprendiniu ; Linux for(int i = ; i<n; i++){ D = sk[i,1]*sk[i,1]-4*sk[i,]*sk[i,2]; if(d>=) { x1 = (-1 * sk[i,1] Math.Sqrt(D)) / (2 * sk[i,]); x2 = (-1 * sk[i,1] + Math.Sqrt(D)) / (2 * sk[i,]); lygtis[i] += x1= + x1 +, x2= + x2; elseif (D<) { lygtis[i] +=, Lygtis neturi sprendiniu ; 12 programos kodas. C# kvadratinių lygčių sprendimas 39

Milisekundės 5 4 3 2 1 5 1 15 2 Duomenų kiekis 15 diagrama. C#kvadratinių lygčių sprendimo greitis Windows Linux Nors C# ir Java kalbomis užrašytas kodas atrodo identiškai, tačiau sprendimo laikas skiriasi (žr. 13 programos kodas.). Java atsilieka (žr. 16 diagrama. Kvadratinių lygčių sprendimo Windows aplinkoje greitis). Didelis Java trūkumas operatyvios atminties padalinimas į dvi dalis, dėl šios priežasties maksimalus galimų skaičiavimų kiekis yra mažesnis esant tam pačiam operatyviosios atminties kiekiui kompiuteryje. Java gali atlikti skaičiavimus kai maksimalus duomenų kiekis vienas milijonas kvadratinių lygčių, o C# testavimų metu buvo pasiekti penki milijonai kvadratinių lygčių Windows aplinkoje. Toliau didinti duomenų kiekio nebeliko prasmės, nes Windows aplinkoje Java pajėgė išspręsti tik milijoną kvadratinių lygčių. Java for(int i = ; i<n; i++){ D = sk[i][1]*sk[i][1]-4*sk[i][]*sk[i][2]; if(d>=){ x1 = (-1 * sk[i][1] Math.sqrt(D)) / (2 * sk[i][]); x2 = (-1 * sk[i][1] + Math.sqrt(D)) / (2 * sk[i][]); lygtis[i] += x1= + x1 +, x2= + x2; elseif (D<) { lygtis[i] +=, Lygtis neturi sprendiniu ; 4

C# for(int i = ; i<n; i++) { D = sk[i,1]*sk[i,1]-4*sk[i,]*sk[i,2]; if(d>=) { x1 = (-1 * sk[i,1] Math.Sqrt(D)) / (2 * sk[i,]); x2 = (-1 * sk[i,1] + Math.Sqrt(D)) / (2 * sk[i,]); lygtis[i] += x1= + x1 +, x2= + x2; elseif (D<) { lygtis[i] +=, Lygtis neturi sprendiniu ; 13 programos kodas. Kvadratinių lygčių sprendimas Windows aplinkoje 8 Milisekundės 6 4 2 Java C# 5 1 15 2 Duomenų kiekis 16 diagrama. Kvadratinių lygčių sprendimo Windows aplinkoje greitis Linux aplinkoje C# ir Java kalbomis užrašytas kodas atrodo identiškai (žr. 14 programos kodas. Kvadratinių lygčių sprendimas Linux aplinkoje), kaip ir Windows aplinkoje, tačiau sprendimo laikas skiriasi (žr. 17 diagrama. Lygčių sprendimo Linux aplinkoje greitis).c# kalboje veiksmai su tekstinėmis eilutėmis atliekami greičiau. Java atsilieka nuo C#. Kaip ir Windows aplinkoje ir visose kitose operacinėse sistemose. Java trūkumas operatyvios atminties padalinimas į dvi dalis, dėl šios priežasties maksimalus galimų skaičiavimų kiekis yra mažesnis esant tam pačiam operatyviosios atminties kiekiui kompiuteryje. Nors Linux aplinkoje Java skiria daugiau atminties heap daliai, dėl šios priežasties programa išsprendė du milijonus kvadratinių lygčių, tačiau pasirodė klaida, dėl nepakankamo atminties kiekio, kai buvo perduoti trys milijonai kvadratinių lygčių. Mono C# Linux aplinkoje programa apskaičiavo penkis milijonus kvadratinių lygčių, tačiau duomenys lentelėse nėra pateikiami, nes net padidinus Java naudojamos operatyvinė atminties dydį iki maksimalaus leidžiamo,java programa negali pasiekti tokių rezultatų. 41

Java for(int i = ; i<n; i++){ D = sk[i][1]*sk[i][1]-4*sk[i][]*sk[i][2]; if(d>=){ x1 = (-1 * sk[i][1] Math.sqrt(D)) / (2 * sk[i][]); x2 = (-1 * sk[i][1] + Math.sqrt(D)) / (2 * sk[i][]); lygtis[i] += x1= + x1 +, x2= + x2; elseif (D<) { lygtis[i] +=, Lygtis neturi sprendiniu ; C# for(int i = ; i<n; i++) { D = sk[i,1]*sk[i,1]-4*sk[i,]*sk[i,2]; if(d>=) { x1 = (-1 * sk[i,1] Math.Sqrt(D)) / (2 * sk[i,]); x2 = (-1 * sk[i,1] + Math.Sqrt(D)) / (2 * sk[i,]); lygtis[i] += x1= + x1 +, x2= + x2; elseif (D<) { lygtis[i] +=, Lygtis neturi sprendiniu ; 14 programos kodas. Kvadratinių lygčių sprendimas Linux aplinkoje 15 Milisekundės 1 5 Java C# 5 1 15 2 Duomenų kiekis 17 diagrama. Lygčių sprendimo Linux aplinkoje greitis 42

Duomenų įrašymas į tekstinius failus Į tekstinius failus pirmoje eilutėje įrašomas kvadratinių lygčių kiekis, žemiau esančiose eilutėse įrašomos lygtys ir gauti rezultatai (žr. 11 pav. C#rezultatai Windows aplinkoje, 12 pav. C# rezultatai Linux aplinkoje,13 pav. Java rezultatai Windows aplinkoje, 14 pav. Java rezultatai Linux aplinkoje). Lentelėje pateikta: duomenų kiekis, programavimo kalba ir operacinė sistema, kurioje buvo atliekami bandymai. Duomenų kiekis kvadratinių lygčių ir reikšmių kiekis. Ties kiekviena programavimo kalba ir operacine sistema nurodomas laikas, kurį užtruko programos, atlikdamos įrašymą milisekundėmis. Duomenų kiekis 1 2 5 1 2 5 1 2 Java (Windows) 26 5 9 27 37 745 2141 Java (Linux) 14 39 48 19 36 656 217 7686 C# (Windows) 71 4 37 19 128 351 156 3122 C# (Linux) 11 21 43 83 154 524 1147 438 9 lentelė. Duomenų įrašymo į tekstinius failus laikai milisekundėmis Pateiktoje rezultatų lentelėje nėra pateiktas laikas, per kurį Java programa įrašo du milijonus kvadratinių lygčių Windows aplinkoje, nes negalėjo jų apskaičiuoti dėl operatyvinės atminties trūkumo, todėl programa nieko neįrašė. Nenorint iškraipyti rezultatų įrašant atsitiktines reikšmes, toliau su tuo duomenų kiekių eksperimentai nebuvo atliekami. Iš gautų rezultatų įrašant duomenis į kietąjį diską Java ir C# duomenų įrašymo greičiai mažai skiriasi, kai kiekis iki šimto tūkstančių kvadratinių lygčių. Programos sukuria tekstinio tipo (.txt) failus. Į failą pirmoje eilutėje įrašomas lygčių kiekis, toliau iš naujos eilutės užrašoma lygties numeris, pilna kvadratinė lygtis ir gautų sprendinių x 1 ir x 2 reikšmės arba, jei lygtis neturi sprendinių, ties ta lygtimi įrašoma Lygtis neturi sprendinių (žr. 11 pav. C#rezultatai Windows aplinkoje, 12 pav. C# rezultatai Linux aplinkoje,13 pav. Java rezultatai Windows aplinkoje, 14 pav. Java rezultatai Linux aplinkoje). Kadangi Java apskaičiuoti rezultatai gaunami keliais skaitmenimis po kablelio didesniu tikslumu, nuo didelio duomenų kiekio susidaro didelis papildomų simbolių kiekis, dėl kurių pailgėja įrašymo trukmė (žr. 18 diagrama. Duomenų įrašymo į failus greitis). 43

Milisekundės 1 8 6 4 2 5 1 15 2 Duomenų kiekis Java (Windows) Java (Linux) C# (Windows) C# (Linux) 18 diagrama. Duomenų įrašymo į failus greitis 11 pav. C#rezultatai Windows aplinkoje 12 pav. C# rezultatai Linux aplinkoje 44

13 pav. Java rezultatai Windows aplinkoje 14 pav. Java rezultatai Linux aplinkoje Milisekundės 4 3 2 1 Java C# 5 1 15 2 Duomenų kiekis 19 diagrama. Duomenų įrašymo greitis Windows aplinkoje 45

Milisekundės 1 8 6 4 2 5 1 15 2 Duomenų kiekis 2 diagrama. Duomenų įrašymų greitis Linux aplinkoje Java C# Abejose bandytose aplinkose Java greitis buvo beveik vienodas. skirtumas iki šimto milisekundžių (žr. 21 diagrama. Java duomenų įrašymo greitis). Milisekundės 1 8 6 4 2 5 1 15 2 Duomenų kiekis 21 diagrama. Java duomenų įrašymo greitis Windows Linux Linux aplinkoje C# užduotį atliko greičiau, nei Windows aplinkoje, kai įrašomų duomenų kiekis neviršijo dviejų šimtų tūkstančių. Viršijus šį kiekį nemokama atviro kodo versija Linux aplinkoje ėmė atsilikti (žr. 22 diagrama. C# duomenų įrašymų greitis). 5 Milisekundės 4 3 2 1 Windows Linux 5 1 15 2 Duomenų kiekis 22 diagrama. C# duomenų įrašymų greitis 46

Abejose programavimo kalbų programose kodai labai panašūs (žr. 15 programos kodas. Duomenų įrašymas į tekstinius failus). Skirtumai: raktiniai žodžiai rašymui į failą. Java kalboje naudojama komanda println(), o C# kalboje komanda WriteLine(). Abi komandos atlieka tą patį veiksmą. Java C# Failas.println(n); Failas.WriteLine (n); for(int i = ; i<n;i++) for(int i = ;i<n; i++) { { Failas.println(lygtis[i]); Failas.WriteLine(lygtis[i]); Failas.close(); Failas.Close(); 15 programos kodas. Duomenų įrašymas į tekstinius failus 47

Lokaliosios duomenų bazės Lokaliosios duomenų bazės darbui buvo pasirinktos dėl paprastesnio darbo. Naudojant lokaliąsias duomenų bazes lengviau kurti ir keisti failus, nes nereikia jungtis prie serverio. Jungimasis prie serverio tampa problema, nes programos veikimas tampa priklausomas nuo interneto ryšio. Padarius pakeitimus lokalioje duomenų bazėje, pakeitimus galima matyti iš karto, nelaukiant, kol duomenys bus įkelti į serverį. Naudojant Java yra sukurta ne viena lokali duomenų bazė, tokios kaip H2, HyperSQL, Apache Derby, DB4O, iboxdbhypertable, Drizzle. Duomenų bazės DB4O, iboxdb, STSdb sukurtos naudojant ir C#, todėl jos veikia operacinėse sistemose, kurios palaiko Java arba.net. Java gali dirbti su H2, HyperSQL, Apache Derby, iboxdb,db4o, Ms Access, SQLite, SQL Server, Hypertable, Drizzle ir kitomis lokaliosiomis duomenų bazėmis. C# gali dirbti su Microsoft Access SQLite, Microsoft SQL Server, iboxdb,db4o, H2 ir kitomis duomenų bazėmis veikiančiomis Windows aplinkoje [1]. SQLite yra atviro kodo ir nemokama naudoti, nesvarbu kokiais tikslais naudojama ji būtų, ar privačiais, ar komerciniais. SQLite duomenis nuskaito ir įrašo tiesiogiai į failus. Duomenų bazės formatas nėra griežtai apibrėžtas, todėl duomenų bazę galima laisvai kopijuoti tarp 32 ir 64 bitų sistemų. SQLite reliacinė duomenų bazių valdymo sistema. SQLite palaiko standartinę SQL sintaksę. SQLite yra C kalba parašyta biblioteka, sukurianti duomenų bazę faile [9]. Microsoft Access arba dar žinomas, kaip Microsoft Office Access, yra duomenų bazių valdymo sistema, kurią sukūrė Microsoft firma. Access saugo duomenis savo formatu, kurio pagrindas Access Jet Database Engine [18]. 48

Darbo pradžia su SQLite duomenų baze C# programavimo kalboje norint dirbti su SQLite duomenų baze reikia naudoti System.Data.SQLite biblioteką, tačiau tai nėra standartinė biblioteka, esanti.net bibliotekų pakete. Ją galima atsisiųsti iš interneto puslapio adresu: http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki. Tuomet biblioteką reikia patalpinti į aplanką projekte. Ir įtraukti biblioteką į projektą naudojant using System.Data.SQLite. Tik atlikus šiuos veiksmus programa, gali dirbti su SQLite duomenų baze. Naudojant nemokamą atviro kodo projektą Mono C# jau yra biblioteka, skirta darbui su SQLite duomenų baze, tereikia ją įtraukti naudojant using Mono.Data.SQLite, tačiau palaikoma tik trečioji versija (SQLite3). Prieš naudojant SQLite duomenų bazę Java programoje būtina įsitikinti, ar kompiuteryje yra SQLite JDBC biblioteka, jei jos nėra, ją galima atsisiųsti: https://bitbucket.org/xerial/sqlitejdbc/downloads. Atsiųstą SQLite-jdbc-(versija).jar failą pridėti prie kuriamo projekto. Šis prijungimas vienodas, nepriklausomai nuo naudojamos operacinės sistemos. Darbas su SQLite duomenų baze Tyrimui buvo sukurta SQLite duomenų bazė, joje buvo sukurta lentelė, kurioje buvo įrašytą dvidešimt tūkstančių įrašų (žr. 15 pav. SQLite duomenų bazė). Vienas įrašas sudarytas iš keturių laukų. Pirmas ID identifikavimo numeris sveikųjų skaičių tipo, antras Vardas tekstinio duomenų tipo laukas, trečias Pavarde tekstinio duomenų tipo laukas ir ketvirtas sveikųjų skaičių duomenų tipo laukas Rezultatas. Laukai Vardas ir Pavarde sugeneruoti iš atsitiktinių simbolių, kurie buvo sudėti į tekstines eilutes, kurių ilgis nuo 5 iki 14 simbolių. Į lauką Rezultatas buvo įrašomi atsitiktiniai sveikieji skaičiai iš intervalo [; 999]. Per eksperimentus atliekamos trys užduotys su duomenų baze: duomenų nuskaitymas iš lentelės eilės tvarka, duomenų nuskaitymas iš lentelės pagal lauką Rezultatas mažėjimo tvarka, duomenų įrašymas eilės tvarka į naują lentelę. 49

15 pav. SQLite duomenų bazė Duomenų skaitymas iš SQLite duomenų bazės Pateiktoje lentelėje (žr. 1 lentelė. Duomenų išrinkimo eilės tvarka iš SQLite duomenų bazės laikai milisekundėmis) pateikti laikai, per kuriuos programos iš eilės nuskaitė nurodytus duomenų kiekius. Laikas nurodytas milisekundėmis. Visose programose naudota ta pati duomenų bazė ir ta pati lentelė su sugeneruotais duomenimis. Naudojama užklausa select * from Lentele. Duomenų kiekis 1 2 5 1 15 2 Java (Windows) 27 28 67 128 169 189 Java (Linux) 136 199 243 274 363 393 C# (Windows) 1 11 36 69 71 158 C# (Linux) 25 47 111 192 291 377 1 lentelė. Duomenų išrinkimo eilės tvarka iš SQLite duomenų bazės laikai milisekundėmis Greičiausiai duomenis nuskaito C# Windows aplinkoje. Iš gautų rezultatų matyti, kad Windows aplinkoje duomenys nuskaitomi greičiau, nei Linux aplinkoje. Lėčiausiai duomenys iš SQLite duomenų bazes nuskaitomi Java kalba Linux aplinkoje (žr. 23 diagrama. Duomenų išrinkimo eilės tvarka iš SQLite duomenų bazės greitis). 5

Milisekundės 45 4 35 3 25 2 15 1 5 Java (Windows) Java (Linux) C# (Windows) C# (Linux) 5 1 15 2 Duomenų kiekis 23 diagrama. Duomenų išrinkimo eilės tvarka iš SQLite duomenų bazės greitis Naudojant užklausą select * from Lentele order by Rezultatas desc iš SQLite duomenų bazės duomenys išrenkami pagal duomenų bazės lauko Rezultatas reikšmes nuo didžiausios iki mažiausios. Duomenų kiekis 1 2 5 1 15 2 Java (Windows) 13 2 43 147 23 291 Java (Linux) 31 37 93 14 219 27 C# (Windows) 7 8 32 69 73 127 C# (Linux) 18 39 98 182 285 373 11 lentelė. Duomenų išrinkimo rikiuojant iš SQLite duomenų bazės laikai milisekundėmis Kaip ir skaitant duomenis iš eilės, taip ir išrenkant pagal tam tikrą tvarką, greičiausiai darbą atlieka C# Windows aplinkoje. Kitaip, nei skaitant iš eilės Java abejose aplinkose darbus atliko per panašų laiką. Lėčiausias pasirodė nemokamas atviro kodo projektas Mono C# (žr. 24 diagrama. Duomenų skaitymo iš SQLite duomenų bazės rikiuojant duomenis greitis). Milisekundės 4 35 3 25 2 15 1 5 5 1 15 2 Duomenų kiekis 24 diagrama. Duomenų skaitymo iš SQLite duomenų bazės rikiuojant duomenis greitis Java (Windows) Java (Linux) C# (Windows) C# (Linux) 51

Atliekant eksperimentus labiausiai nustebino tai, kad duomenų išrinkimas iš SQLite duomenų bazės, kokia nors tvarka atliekamas tokiu pačiu greičiu arba dar greičiau, nei duomenų išrinkimas eilės tvarka. Naudojant abi Microsoft C# ir Mono C# programavimo kalbos versijas, duomenų išrinkimas iš SQLite duomenų bazės išrenkant duomenis tam tikra tvarka, atliekama panašiu greičiu, kaip ir išrinkimas skaitant duomenis iš eilės. Naudojant Mono C#, didėjant išrenkamų duomenų kiekiui išrinkimo greičiai išsilygina, tačiau esant mažesniam išrenkamų duomenų kiekiui, užklausa select * from Lentele order by Rezultatas desc atliekama nežymiai greičiau nei užklausa select * from Lentele (žr. 25 diagrama. C# Linux aplinkoje išrinkimo iš duomenų bazės greitis). 4 Milisekundės 3 2 1 Pagal rezultatus Iš eilės 5 1 15 2 Duomenų kiekis 25 diagrama. C# Linux aplinkoje išrinkimo iš duomenų bazės greitis Vykdant programą Microsoft firmos C# programavimo kalba, duomenų nuskaitymas iš SQLite duomenų bazės atliekamas panašiu greičiu, tačiau duomenų kiekiui viršijus penkiolika tūkstančių įrašų, skaitymas iš eilės pradeda ryškiau atsilikti (žr. 26 diagrama. C# Windows aplinkoje išrinkimo iš duomenų bazės greitis). 15 Milisekundės 1 5 Pagal rezultatus Iš eilės 5 1 15 2 Duomenų kiekis 26 diagrama. C# Windows aplinkoje išrinkimo iš duomenų bazės greitis 52

Windows aplinkoje Java programa elgiasi, kiek kitaip, išrenkamų duomenų kiekiui nesiekiant septynių tūkstančių įrašų užklausa select * from Lentele atliekama greičiau,bet viršijus šį kiekį greičiau imama vykdyti užklausa select * from Lentele order by Rezultatas desc (žr. 27 diagrama. Java Windows aplinkoje išrinkimo iš duomenų bazės greitis). 35 3 Milisekundės 25 2 15 Pagal_rezultatus 1 Iš eilės 5 5 1 15 2 Duomenų kiekis 27 diagrama. Java Windows aplinkoje išrinkimo iš duomenų bazės greitis Linux aplinkoje Java elgiasi kitaip, domenų išrinkimas iš SQLite duomenų bazės skaitant duomenis iš eilės atsiliekama lėčiau, nei išrenkant kokia nors tvarka ir ši tendencija išlieka nepaisant išrenkamo duomenų kiekio (žr. 28 diagrama. C# Linux aplinkoje išrinkimo iš duomenų bazės greitis). 5 4 Milisekundės 3 2 1 Pagal rezultatus Iš eilės 5 1 15 2 Duomenų kiekis 28 diagrama. C# Linux aplinkoje išrinkimo iš duomenų bazės greitis 53

Duomenų įrašymas į SQLite duomenų bazę Į SQLite duomenų bazę įrašomi duomenys, kurie buvo nuskaityti naudojant užklausą select * from Lentele. Duomenų bazėje kiekvienam bandymui buvo sukuriama nauja lentelė, į kurią ir buvo įrašomi duomenys naudojant užklausą insert into + lentele + (ID, Vardas,Pavarde,Rezultatas) values ( + id[i] +, + vardas[i] +, + pavarde[i] +, + rezultatas[i] + ) (žr. 16 pav. Lentelės SQLite duomenų bazėje). Sukurtų lentelių pavadinimai nurodo: kokia kalba vykdyta užklausa, kurioje aplinkoje programa veikė, koks duomenų kiekis įrašytas į lentelę. Įrašant duomenis į SQLite duomenų bazę susidurta su didele problema, duomenys įrašomi labai lėtai. Laikas matuojamas milisekundėmis, todėl iš pateiktų rezultatų lentelėje sunku pasakyti, koks tai didelis laiko tarpas(žr. 12 lentelė. Duomenų įrašymo į SQLite duomenų bazę laikai milisekundėmis). 16 pav. Lentelės SQLite duomenų bazėje Duomenų kiekis 1 2 5 1 15 2 Java (Windows) 167632 323641 89387 154826 24446 3599273 Java (Linux) 21341 6293 94127 1617464 2369647 3266159 C# (Windows) 165766 327789 814157 177537 2421274 3753583 C# (Linux) 1564 189849 47431 13884 1487791 2118421 12 lentelė. Duomenų įrašymo į SQLite duomenų bazę laikai milisekundėmis 54

Gretimoje lentelėje (žr. 13 lentelė. Duomenų įrašymo į SQLite duomenų bazę laikai minutėmis) pateikti rezultatai perskaičiuoti iš milisekundžių į minutes, siekiant susidaryti aiškesnį vaizdą, kaip ilgai atliekamas įrašymas į SQLite duomenų bazę. Duomenų kiekis 1 2 5 1 15 2 Java (Windows) 2,8 5,4 14,9 25,8 4 6 Java (Linux) 3,6 1 15,7 27 39,5 54,4 C# (Windows) 2,8 5,5 13,6 28,5 4,4 62,6 C# (Linux) 1,8 3,2 7,9 17,2 24,8 35,3 13 lentelė. Duomenų įrašymo į SQLite duomenų bazę laikai minutėmis Diagramoje matyti (žr. 29 diagrama. Duomenų įrašymo į SQLite duomenų bazę greitis), kad Java abejose aplinkose ir C# Windows aplinkoje duomenis įrašo panašiu greičiu. Tačiau nemokamas atviro kodo projektas Mono C# užklausą insert into + lentele + (ID, Vardas,Pavarde,Rezultatas) values ( + id[i] +, + vardas[i] +, + pavarde[i] +, + rezultatas[i] + ) atlieka gerokai greičiau. 4 Milisekundės 3 2 1 5 1 15 2 Duomenų kiekis 29 diagrama. Duomenų įrašymo į SQLite duomenų bazę greitis Java (Windows) Java (Linux) C# (Windows) C# (Linux) Pagal nutylėjimą SQLite duomenų bazė prieš įrašydama duomenis į duomenų bazę, pirmiausia laukia, kol duomenys bus išsaugoti pastoviojoje atmintyje, ir tik po to duomenis rašo į duomenų bazę. Tai užtikrina duomenų saugumą dingus elektros sroviai ar sutrikus operacinės sistemos veiklai. Į SQLite duomenų bazę galima įrašyti duomenis ir nesaugant jų pastoviojoje atmintyje. Išjungus sinchronizavimą SQLite duomenų bazėje įrašymo greitis padidėja nuo penkiasdešimties ir daugiau kartų, tačiau nutrūkus įrašymui, dėl dingusios elektros srovės ar sutrikusios operacinės sistemos veiklos duomenų bazė gali būti sugadinta. 55

Darbo pradžia su Access duomenų baze Norint naudotis Access duomenų bazę C# Windows aplinkoje nereikia siųstis jokių bibliotekų. Tai standartinė biblioteka, esanti.net bibliotekų pakete. Biblioteką tereikia įtraukti naudojant raktinius žodžius using System.Data.OleDb. Mono C# Linux aplinkoje naudoti Access duomenų bazes galima tik teoriškai, bibliotekos skirtos prisijungimui ir darbui yra, tačiau Linux aplinkoje nėra tilto tarp operacinės sistemos ir Access duomenų bazės. Mono kūrėjams šiuo metu tai nėra prioritetinė užduotis, todėl greičiausiu metu nebus galimybės Linux aplinkoje naudotis Microsoft Access duomenų bazėmis [13]. Windows aplinkoje dirbant su Java tai pat nereikia siųstis jokių bibliotekų, reikia importuoti klasę prisijungimui prie duomenų bazių import Java.sql.*;. Linux aplinkoje Java net ir turėdama tinkamą klasę negali pilnai dirbti su Access duomenų bazėmis. Linux aplinkoje nėra JDBC-ODBC (JOB) tilto leidžiančio bendrauti Java programavimo kalbai ir Access duomenų bazėms. Šis tiltas realizuotas tik Windows aplinkoje. Naudojantis esamomis klasėmis Java programose galima nuskaityti duomenis iš duomenų bazių, bet negalima jų įrašinėti, kurti lentelių ar duomenų bazių. Taigi norint dirbti su Access duomenų baze ji jau turi būti sukurta, joje jau turi būti sukurtos lentelės, kurios turi būti užpildytos duomenimis. Norint Linux aplinkoje Java programavimo kalba laisvai be apribojimų dirbti su Access duomenų bazėmis, galima įsigyti JDBC-ODBC tiltą tarp Access duomenų bazės ir operacinių sistemų Windows, Linux ir Unix. Šis tiltas kainuoja apie 657 eurus (~2268Lt). Jį galima įsigyti šiuo adresu: http://www.easysoft.com/products/data_access/jdbc_odbc_bridge/index.html#section=tab-1. 56

Darbas su Access duomenų baze Tyrimui buvo sukurta Access duomenų bazė, joje buvo sukurta lentelė, kurioje buvo įrašyta dvidešimt tūkstančių įrašų (žr. 17 pav. Access duomenų bazė). Vienas įrašas sudarytas iš keturių laukų. Pirmas ID identifikavimo numeris sveikųjų skaičių tipo, antras Vardas tekstinio duomenų tipo laukas, trečias Pavarde tekstinio duomenų tipo laukas ir ketvirtas sveikųjų skaičių duomenų tipo laukas Rezultatas. Laukai Vardas ir Pavarde sugeneruoti iš atsitiktinių simbolių, kurie buvo sudėti į tekstines eilutes, kurių ilgis nuo 5 iki 14 simbolių. Į lauką Rezultatas buvo įrašomi atsitiktiniai sveikieji skaičiai iš intervalo [; 999]. 17 pav. Access duomenų bazė Per eksperimentus atliekamos analogiško užduotys su duomenų baze: duomenų nuskaitymas iš lentelės eilės tvarka, duomenų nuskaitymas iš lentelės pagal lauką Rezultatas mažėjimo tvarka ir duomenų įrašymas eilės tvarka į naują lentelę kaip ir SQLite domenų bazėje. 57

Duomenų skaitymas iš Access duomenų bazės Kadangi Linux aplinkoje Mono C# negali dirbti su Access duomenų bazėmis, todėl duomenų i6rinkimo rezultatų nėra pateiktoje lentelėje (žr. 14 lentelė. Duomenų išrinkimo eilės tvarka iš Access duomenų bazės laikai milisekundėmis). Duomenų kiekis 1 2 5 1 15 2 Java (Windows) 7 76 126 173 26 296 Java (Linux) 52 83 12 189 237 298 C# (Windows) 5 11 31 54 91 117 C# (Linux) 14 lentelė. Duomenų išrinkimo eilės tvarka iš Access duomenų bazės laikai milisekundėmis Windows ir Linux aplinkose Java duomenis iš eilės išrenka panašiu greičiu, tačiau smarkiai atsilieka nuo C#, kaip ir su SQLite duomenų baze (žr. 3 diagrama. Duomenų išrinkimo eilės tvarka iš Access duomenų bazės greitis). Duomenų išrinkimui eilės tvarka naudojama užklausa SELECT * FROM Lentele. Milisekundės 35 3 25 2 15 1 5 5 1 15 2 Duomenų kiekis Java (Windows) Java (Linux) C# (Windows) 3 diagrama. Duomenų išrinkimo eilės tvarka iš Access duomenų bazės greitis Dėl jau minėtų priežasčių rezultatų lentelėje nėra Mono C# rezultatų (žr. 15 lentelė. Duomenų išrinkimo rikiuojant iš Access duomenų bazės laikai milisekundėmis). Duomenų kiekis 1 2 5 1 15 2 Java (Windows) 14 26 63 133 238 258 Java (Linux) 3 32 49 147 198 226 C# (Windows) 7 13 27 64 87 112 C# (Linux) 15 lentelė. Duomenų išrinkimo rikiuojant iš Access duomenų bazės laikai milisekundėmis 58

Kaip ir rezultatai gauti atliekant eksperimentus su SQLite duomenų baze, greičiausiai su Access duomenų baze dirba C#. Java abejose aplinkose duomenis išrinko panašiu greičiu, tačiau nuo trylikos tūkstančių įrašų Windows operacinėje sistemoje Java pradėjo atsilikinėti nuo analogiškos programos Linux operacinėje sistemoje. Duomenų išrinkimui buvo naudojama tokia užklausa SELECT * FROM Lentele ORDER BY Rezultatas DESC. Kaip ir dirbant su SQLite duomenų baze, išrenkant duomenis iš Access duomenų bazės tam tikra tvarka, išrinkimas atliekamas greičiau nei imant įrašus iš eilės (žr. 31 diagrama. Duomenų išrinkimo pagal rezultatus iš Access duomenų bazės greitis). 3 25 Milisekundės 2 15 1 5 5 1 15 2 Duomenų kiekis Java (Windows) Java (Linux) C# (Windows) 31 diagrama. Duomenų išrinkimo pagal rezultatus iš Access duomenų bazės greitis C# kalba parašytoje programoje nėra ryškaus skirtumo tarp įrašų išrinkimo eilės tvarka ir išrinkimo mažėjimo tvarka pagal lentelės lauką Rezultatas (žr. 32 diagrama. C# Windowsaplinkoje skaitymo iš Access duomenų bazės greitis). 14 12 Milisekundės 1 8 6 4 2 Iš eilės Pagal rezultatus 5 1 15 2 Duomenų kiekis 32 diagrama. C# Windowsaplinkoje skaitymo iš Access duomenų bazės greitis 59

Java Windows ir Linux aplinkose skirtumai tarp išrinkimo eilės tvarka ir išrenkant pagal konkretų lauką mažėjimo tvarka Access duomenų bazėje išlieka, kaip ir SQLite duomenų bazėje (žr.33 diagrama. Java Linux aplinkoje skaitymo iš Access duomenų bazės greitis). Įrašų išrinkimas eilės tvarka atliekamas lėčiau, nei išrenkant pagal kriterijų. 35 3 Milisekundės 25 2 15 1 5 5 1 15 2 Duomenų kiekis Iš eilės Pagal rezultatus 33 diagrama. Java Linux aplinkoje skaitymo iš Access duomenų bazės greitis 6

Duomenų įrašymas į Access duomenų bazę Access Duomenų bazėje išrinkti duomenys įrašomi į atskiras lenteles, kurių pavadinimai nurodo: programavimo kalbą, operacinę sistemą ir įrašų kiekį lentelėje (žr. 18 pav. Lentelės Access duomenų bazėje). Kadangi Linux operacinėje sistemoje nėra tilto tarp Access duomenų bazių ir pačios operacinės sistemos, duomenų įrašymo rezultatų nėra nei Mono C#, nei Java kalbomis. Didžiausią staigmeną sukėlė laikas, per kurį buvo įrašomi išrinkti įrašai (žr. 16 lentelė. Įrašų įrašymo į Access duomenų bazę laikai milisekundėmis). Java Windows aplinkoje vidutiniškai 341 kartą greičiau įrašo duomenis į Access duomenų bazę, nei SQLite duomenų bazę. C# Windows aplinkoje vidutiniškai 227 kartus greičiau įrašo duomenis į Access duomenų bazę, nei SQLite duomenų bazę. 18 pav. Lentelės Access duomenų bazėje Duomenų kiekis 1 2 5 1 15 2 Java (Windows) 61 145 2483 4715 6584 889 Java (Linux) C# (Windows) 916 1599 3694 6933 1498 13354 C# (Linux) 16 lentelė. Įrašų įrašymo į Access duomenų bazę laikai milisekundėmis Tai pat netikėta, jog Java duomenis į Access duomenų bazę įrašo greičiau nei C#, nors abu C# ir Access yra Microsoft firmos kūrinai (žr. 34 diagrama. Įrašų rašymo į Access duomenų bazę greitis). 61

16 14 12 Milisekundės 1 8 6 4 2 5 1 15 2 Duomenų kiekis Java (Windows) C# (Windows) 34 diagrama. Įrašų rašymo į Access duomenų bazę greitis 62

Java baitkodo ir mašininio kodo palyginimas Sukompiliavus Java programą su Excelsior JET programa, Windows aplinkoje sukuriamas failas su plėtiniu.exe, Linux aplinkoje sukuriamas failas su plėtiniu.bin. Visi eksperimentai buvo atliekami naudojant tuos pačius duomenis. Programų kodai nebuvo keičiami. Duomenų skaitymas naudojant srautus iš tekstinių failų greičiausiai atliekamas Linux aplinkoje, programoje sukompiliuotoje tiesiai į mašininį kodą. Gauti rezultatai rodo, kad programos sukompiliuotos į mašininį kodą skaito duomenis iš failų greičiau (žr. 35 diagrama. Duomenų skaitymo iš failų greitis). 3 25 Milisekundės 2 15 1 5 5 1 15 2 Duomenų kiekis Java(exe) Java(bin) Java (Windows) Java (Linux) 35 diagrama. Duomenų skaitymo iš failų greitis Skaičiuojant trikampių plotus pagal Herono formulę, programos su plėtiniais.exe ir.bin Windows ir Linux aplinkose skaičiavo vienodu greičiu. Šios programos greičiu lenkia programas naudojančias JVM (žr. 36 diagrama. Trikampių plotų skaičiavimo pagal Herono formulę greitis). Milisekundės 14 12 1 8 6 4 2 5 1 15 2 Duomenų kiekis Java (exe) Java(Windows) Java (bin) Java (Linux) 36 diagrama. Trikampių plotų skaičiavimo pagal Herono formulę greitis 63

Atliekant veiksmus su simbolių eilutėmis programos, sukompiliuotos tiesiai į mašininį kodą, atlieka veiksmus lėčiau, nei naudojant JVM interpretatorių. Tačiau programoms su plėtiniais.exe ir.bin nebereikia naudoti JRE, tai leidžia išnaudoti didesnį operatyviosios atminties kiekį. Windows aplinkoje programas su plėtiniu.jar negalėjo apskaičiuoti kvadratinių lygčių, kai jų kiekis viršijo vieną milijoną lygčių, tačiau programas su plėtiniu.exe apskaičiavo du milijonus kvadratinių lygčių (žr. 37 diagrama. Kvadratinių lygčių sprendimo greitis). 6 5 Milisekundės 4 3 2 1 Java(exe) Java(bin) Java (Windows) Java (Linux) 5 1 15 2 Duomenų kiekis 37 diagrama. Kvadratinių lygčių sprendimo greitis Duomenų įrašymas į tekstinius failus atliekamas greičiau naudojant baitkodą ir JVM. Java sukompiliuota tiesiai į mašininį kodą duomenis įrašo lėčiau. Didėjant įrašomų duomenų kiekiui lėčiausiai įrašymas atliekamas Linux aplinkoje (žr. 38 diagrama. Duomenų įrašymo į failus greitis). Milisekundės 8 7 6 5 4 3 2 1 5 1 15 2 Duomenų kiekis Java(exe) Java(bin) Java (Windows) Java (Linux) 38 diagrama. Duomenų įrašymo į failus greitis 64

Duomenų įrašymo greitis į Access duomenų bazę praktiškai nesiskiria tarp programos sukompiliuotos tiesiai į mašininį kodą ir programos sukompiliuotos į baitkodą (žr. 39 diagrama. Įrašų rašymo į Access duomenų bazę greitis). Milisekundės 1 9 8 7 6 5 4 3 2 1 5 1 15 2 Duomenų kiekis Java(exe) Java (Windows) 39 diagrama. Įrašų rašymo į Access duomenų bazę greitis Java programos sukompiliuotos tiesiai į mašininį kodą greičiau išrenka įrašus iš Access duomenų bazės, nei Java programos naudojančios JVM. Tačiau kompiliuojant programas tiesiai į mašininį kodą Windows aplinkoje Java nepasiekia tokio greičio, kaip C#. Panašiu greičiu, kaip C# veikia tik Java programa, sukompiliuota tiesiai į mašininį kodą Linux aplinkoje (žr. 4 diagrama. Duomenų išrinkimas eilės tvarka iš Access duomenų bazės). 35 3 Milisekundės 25 2 15 1 5 5 1 15 2 Java(exe) Java (Windows) Java (bin) C# (Windows) Java (Linux) Duomenų kiekis 4 diagrama. Duomenų išrinkimas eilės tvarka iš Access duomenų bazės Java programa, sukompiliuota tiesiai į mašininį kodą, Linux aplinkoje greičiau išrenka įrašus pagal pasirinktą lauką iš Access duomenų bazės, nei Java programos naudojančios JVM. Windows aplinkoje 65

sukompiliuotos tiesiai į mašininį kodą programos greitis mažai skiriasi nuo programų naudojančių JVM (žr. 41 diagrama. Duomenų išrinkimo pagal rezultatus iš Access duomenų bazės greitis). 3 25 Milisekundės 2 15 1 5 5 1 15 2 Duomenų kiekis Java(exe) Java (bin) Java (Windows) Java (Linux) C# (Windows) 41 diagrama. Duomenų išrinkimo pagal rezultatus iš Access duomenų bazės greitis Duomenų įrašymas į SQLite duomenų bazę atliekamas tokiu pačiu greičiu, nesvarbu, ar programa sukompiliuota tiesiai į mašininį kodą ar naudojant JVM (žr. 42 diagrama. Duomenų įrašymo į SQLite duomenų bazę greitis). Pagal nutylėjimą SQLite duomenų bazė prieš įrašydama duomenis į duomenų bazę, pirmiausia laukia, kol duomenys bus išsaugoti pastoviojoje atmintyje, ir tik po to duomenis rašo į duomenų bazę. Tai užtikrina duomenų saugumą dingus elektros srovei ar sutrikus operacinės sistemos veiklai. 4 3 Milisekundės 2 1 Java (exe) Java (bin) Java (Windows) Java (Linux) 5 1 15 2 Duomenų kiekis 42 diagrama. Duomenų įrašymo į SQLite duomenų bazę greitis 66

Windows aplinkoje programa sukompiliuota tiesiai į mašininį kodą išrenka įrašus iš SQLite duomenų bazės panašiu greičiu, kaip naudojanti JVM. Linux aplinkoje programa sukompiliuota tiesiai į mašininį kodą veikia greičiau, bet neprilygsta programų greičiui Windows aplinkoje (žr. 43 diagrama. Duomenų skaitymo iš SQLite duomenų bazės greitis). Visos Java programos atsilieka nuo C# programų, išrenkant įrašus iš SQLite duomenų bazės. 5 4 Milisekundės 3 2 1 5 1 15 2 Java (exe) Java (bin) Java (Windows) Java (Linux) Duomenų kiekis 43 diagrama. Duomenų skaitymo iš SQLite duomenų bazės greitis Išrenkant įrašus pagal lentelės lauką (Rezultatas) mažėjimo tvarka, greičiausiai užduotį atlieka programa sukompiliuota tiesiai į mašininį kodą Windows aplinkoje. Lėčiausiai išrinkimo užklausą atlieka programa sukompiliuota tiesiai į mašininį kodą Linux aplinkoje (žr. 44 diagrama. Duomenų skaitymo iš SQLite duomenų bazės rikiuojant duomenis greitis). 67

5 Milisekundės 4 3 2 1 Java (exe) Java (bin) Java (Windows) Java (Linux) 5 1 15 2 Duomenų kiekis 44 diagrama. Duomenų skaitymo iš SQLite duomenų bazės rikiuojant duomenis greitis C# ir Java aplikacijos kūrimas mobiliesiems telefonams Android yra atviro kodo operacinė sistema, kuri labai plačiai naudojama išmaniuosiuose telefonuose ir planšetiniuose kompiuteriuose. Ši operacinė sistema, tai Linux operacinės sistemos ir įvairių Google sukurtų papildomų plėtinių kombinacija. Šioje operacinėje sistemoje naudojama programavimo kalba Java. Kuriamos programos sąsaja yra dalinai aprašoma.xml (extensible markup language) [19]. Kurti programas išmaniesiems telefonams ir planšetiniams kompiuteriams su Android operacine sistema yra sukurtos kelios aplinkos: Eclipse, Android studio, IntelliJ IDEA, NetBeans. Kompiuteryje tai pat reikia įdiegti Android emuliatorių, tačiau tai nėra būtina, nes sukurtas programas galima paleisti tiesiai į įrenginį. Programų testavimas naudojant Android emuliatorių užtrunka ilgiau ir naudoja daugiau kompiuterio resursų, nei testavimas mobiliajame įrenginyje. Sukūrus naują projektą sukuriamas ir rodomas grafinis langas, kuriame yra antraštė su projekto pavadinimu ir teksto laukas su žodžiais Hello World, kuriame galima įkelti norimus valdiklius, tokius kaip mygtukai, teksto laukai, etiketės ir kitus valdiklius (žr. 19 pav. Naujas Android projektas). Pirmas objektas kuris būtinas, tai schema pagal kurią bus lygiuojami kiti valdikliai (layout), įprastai pagal nutylėjimą jau būna įkelta tokia schema. Visi reikalingi objektai įkeliami iš įrankių juostos. 68

19 pav. Naujas Android projektas Du kartus spragtelėjus pele ant bet kurio objekto atveriamas langas, kuriame yra.xml kodas (žr. 16 programos kodas. Objekto.xml kodas). Kode aprašyti visi įkelti objektai ir jų savybės. 69

<Button Android:id="@+id/button1" Android:layout_width="match_parent" Android:layout_height="wrap_content" Android:layout_marginTop="124dp" Android:text="Button"/> 16 programos kodas. Objekto.xml kodas Visi įkelti objektai turi turėti unikalius vardus, aprašytus xml kode Android:id="@+id/varadas", visi sukurti objektai yra vieši ir prieinami visoms klasėms. Nesvarbu kiek būtų sukurta xml failų, tačiau visų objektų, esančių failuose, vardai turi būti skirtingi. 2 pav. Android programos langai Java kode pagrindinėje klasėje nurodoma, kurį.xml failą rodyti išmaniojo telefono ar planšetinio kompiuterio ekrane, naudojant funkciją setcontentview(r.layout.activity_main) (žr. 17 programos kodas. Pagrindinėje klasėje nurodomas.xml failas). Failas pasirenkamas iš jau esamų failų sąrašo (žr. 2 pav. Android programos langai). publicclass MainActivity extends ActionBarActivity { @Override protectedvoid oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); 7

17 programos kodas. Pagrindinėje klasėje nurodomas.xml failas Norint naudoti visus įkeltus valdiklius, aprašytus.xml kode Java klasėje, būtina sukurti norimo tipo objektus ir jiems priskirti.xml kode aprašyto objekto vardą. Button ivd = (Button) findviewbyid(r.id.ivadas);. Toliau aprašomi veiksmai Java kode, ką turi daryti sukurtas objektas. Java skirtingose klasėse galima naudoti tuos pačius vardus Java objektams (žr. 18 programos kodas. Vienodi objektų vardai skirtingose klasėse). Pirma klasė publicclass MainActivity extends ActionBarActivity { @Override protectedvoid oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); Button migtukas = (Button) findviewbyid(r.id.ivadas); Antra klasė publicclass Priskirimas extends ActionBarActivity { @Override protectedvoid oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.priskirimas); Button migtukas= (Button) findviewbyid(r.id.p3); 18 programos kodas. Vienodi objektų vardai skirtingose klasėse Windows yra operacinė sistema išmaniesiems telefonams, kurią sukūrė Microsoft firma. Šioje operacinėje sistemoje naudojamos programavimo kalbos C# ir Visual Basic. Windows Phone išmaniųjų telefonų programų kūrimui yra aplinkos tokios kaip Microsoft Visual Studio 21 for Windows Phone, Microsoft Visual Studio 212 for Windows Phone. Naudojant Microsoft Visual Studio 21 for Windows Phone aplinką galima kurti programas tik Windows phone 7. ir Windows Phone 7.1 operacinėms sistemoms, tačiau naujesnėse operacinių sistemų versijose 71

Windows Phone 8. ir Windows Phone 8.1 programos tai pat veikia. Parašius programas Microsoft Visual Studio 212 for Windows Phone aplinkoje programos veikia tik Windows Phone 8. ir Windows Phone 8.1 operacinėse sistemose. Kompiuteryje tai pat reikia įdiegti Windows Phone emuliatorių. Windows Phone emuliatorius pasižymi tuo, kad veikia labai greitai, neapkrauna kompiuterio, kaip Android emuliatorius. Programuojant Windows Phone yra galimybė programas testuoti ne emuliatoriuje, bet išmaniajame telefone, tačiau greičio skirtumas nėra didelis, todėl labai patogu naudoti emuliatorių [15]. Sukūrus naują projektą, sukuriamas grafinis langas su dviem teksto laukais, šalia grafinio lango rodomas.xaml kodas. Kaip ir Android naudojamame.xml kode, taip ir Microsoft.xaml kode aprašomos įkeltų objektų savybės (žr. 21 pav. Naujas Windows Phone projektas). 21 pav. Naujas Windows Phone projektas Kitaip nei Android programose,.xaml kode aprašyti objektai yra lokalūs ir nematomi kitoms klasėms. Tai labai patogu naudojant kelis langus, kuriuose tokie patys objektai, atliekantys tas pačias operacijas ir jiems galima suteikti tokius pačius vardus. Kaip ir Android, taip ir Windows Phone programai reikalingi valdikliai imami iš įrankių juostos, kurioje yra mygtukai, tekstų laukai, etiketės ir kiti valdikliai (žr. 22 pav. Įrankių juosta). 72

22 pav. Įrankių juosta Du kartus spustelėjus pele ant įkelto objekto, atveriamas langas su C# kodu, kuriame automatiškai sugeneruojama dalis kodo (žr. 19 programos kodas. Automatiškai sugeneruojamas C# kodas). Kuriant programas, skirtas Windows Phone, nereikia susieti C# objektų su.xaml objektais, tai atliekama automatiškai. publicpartialclassmainpage : PhoneApplicationPage { // Constructor public MainPage() { InitializeComponent(); privatevoid mygtukas_click(object sender, RoutedEventArgs e) { 19 programos kodas. Automatiškai sugeneruojamas C# kodas Automatinis susiejimas padeda išvengti klaidų, kai susiejami objektai yra skirtinguose failuose. Tai pat galima automatiškai sugeneruoti įvykių kodus (žr. 23 pav. Automatinis įvykių generavimas). 73

23 pav. Automatinis įvykių generavimas Pagrindinis trūkumas programuojant Windows Phone izoliuoti failai ir aplankai. Tiesiogiai nuskaityti izoliuotus failus neįmanoma, kaip ir įeiti į izoliuotus aplankus. Tai sukelia problemų, kai norima atidaryti skaitymui ar rašymui failus esančius aplankuose. Iš pirmo žvilgsnio failų ir aplankų izoliavimas turėtų suteikti saugumą, bet taip nėra, nes pridėjus biblioteką iš trečiųjų šalių, apsauginis mechanizmas išjungiamas ir atsiranda laisvas priėjimas prie failų. Yra sukurtas nemokamas ir atviro kodo projektas Xamarine, skirtas kurti programas išmaniesiems telefonams naudojant C# programavimo kalbą. Tą patį parašytą programos kodą galima vykdyti Windows Phone, Android, ios operacinėse sistemose. Projekto kūrėjai teigia, kad viską, ką galima padaryti su Java, Swift ar Objectiv-C galima padaryti ir su C#. Ši aplinka nebuvo išbandyta ir nebuvo sukurta jokių programų. 74