Vad är snabbast: Java + Socket + C++ eller endast Java?

Trädvy Permalänk
Medlem
Plats
Örnsköldsvik
Registrerad
Jun 2008

Vad är snabbast: Java + Socket + C++ eller endast Java?

Hej!

Jag har kommit till en situation där jag inte vill vara. Jag tvingas lära mig programmera på låg nivå, vilket jag tycker är tråkigt. Jag ogillar just C och C++ för dem är krävande. Men självklart får man tillbaka något också.

Jag har ett program som är skrivet i Java och denna ska utföra beräkningar, samtidigt som den gör något annat. Det får inte ta mer än en sekund och det är mycket matematiska matrisberäkningar och kurvanpassningar.

Jag använder Java för inbyggda system med webbapplikationer, vilket har börjat bli allt mer och mer populärt då man slipper tråkiga LCD skärmar eller liknande GUI. Så Java i detta fall styr hårdvaran + hostar upp en hemsida. Detta är rätt krävande för datorn då datorn är mycket liten. En raspberry pi med andra ord. Nu ska detta javaprogram utföra matrisberäkningar också.

Då undrar jag om det är smart av mig att öppna en kommunikation mellan Java och C++ via socket? Med C++ hittar jag fina bibliotek som kan enkelt utföra arbetet åt mig. Jag hade tänkt att Java skickar data till C++ och C++ beräknar som ut i helvete. Sedan skickar C++ tillbaka resultatet till Java. Är detta smart, eller bör jag köra allt i Java? Det finns beräkningsbibliotek för Java också, men dock så kräver det att jag skriver mer Java-kod också som tuggar igenom datan.

Så vad skulle ni välja?
1. Java + Socket + C++
2. Allt i Java

Jag tänkte först ha C som beräknare, men helvete vad svårt det är att beräkna matriser i C då det är många steg där i mellan jämfört med C++ biblioteket Dlib som jag har tänkt använda då jag får mer utav C++ än C.

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Hedesunda
Registrerad
Dec 2005

Testa, men kompilerad C++ lär du får svårt att bräcka med tolkad kod.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Okt 2016

som tidigare sagts så har jag väldigt svårt att tro att java kan bräcka c/c++ när det kommer till rena beräkningar just pga att det är kompilerad kod. Med det sagt så hade jag nog med den info du ger fortfarande försökt bilda mig en uppfattning om ifall det går att komma undan med java av den enkla anledningen att ditt program blir lättare att underhålla om det är skrivet i ett språk istället för flera olika.

Trädvy Permalänk
Medlem
Plats
Skåne
Registrerad
Jan 2011

Beror på hur bra du behärskar de andra språken. Det är inte särskilt konstigt att blanda in andra språk i samma program/system, ibland behövs det då språk är bra på olika saker. Definera tydliga interfaces mellan modulerna så att du enkelt kan byta ut de mot andra ifall det inte fungerar.

Stationär:Asrock P67 Extreme 4 | i5 2500K@4.5Ghz | Asus GTX 970 black Överklockad | Samsung Evo 960 1TB, 2x WD blue 5TB | 8GB Corsair XMS3 + 8GB Hyper x Fury | EVGA Supernova G2 750W Gold | Silverstone FT02
Laptop: Dell XPS 15 2017
Mobil: Oneplus 6 128GB

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

Enda sättet att veta om du vinner prestanda är nog att benchmarka två beräkningsprogram i de olika språken mot varandra.

Om webbgränssnittet och beräkningen alltid kör på samma burk kan man ju överväga andra tekniska gränssnitt än sockets, till exempel stdin/stdout, fil, JNI eller delat minne. Jag hade nog kört på stdin/stdout för att kunna köra beräkningsprogrammet oberoende av allt annat - men det har ju kostnaden att skapa en ny process för varje beräkning.

Trädvy Permalänk
Medlem
Plats
Örnsköldsvik
Registrerad
Jun 2008
Skrivet av hasenfrasen:

Testa, men kompilerad C++ lär du får svårt att bräcka med tolkad kod.

Ja. C++ kod lär vara svårare än Java kod. C++ är ju dessutom svåraste språket. Men jag finner det svårt att hitta något mer effektivare språk som har rätt bibliotek samt går att kompilera. Jag har testat Julia, men det är hur segt som helst. Bluffspråk!

Skrivet av mmarks:

som tidigare sagts så har jag väldigt svårt att tro att java kan bräcka c/c++ när det kommer till rena beräkningar just pga att det är kompilerad kod. Med det sagt så hade jag nog med den info du ger fortfarande försökt bilda mig en uppfattning om ifall det går att komma undan med java av den enkla anledningen att ditt program blir lättare att underhålla om det är skrivet i ett språk istället för flera olika.

Tanken är att Java ska sköta webbapplikationen och I/O på hårdvaran. C++ sköta beräkningen för att Java ska avgöra hur I/O ska vara. Tänk dig att du ska spotta ut ett värde mellan 0 och 255. Men du vet inte vilket värde du har. Allt du har är värden i en 100 lång array. Du skickar arrayen till C++ och låter C++ göra en djup beräkning med matriser och kvadratisk programmering samt massa for-loopar. Efter C++ är klar så skickar den tillbaka ett värde till dig så du kan avgöra vilket värde mellan 0 och 255 du ska spotta ut.

Skrivet av Baxtex:

Beror på hur bra du behärskar de andra språken. Det är inte särskilt konstigt att blanda in andra språk i samma program/system, ibland behövs det då språk är bra på olika saker. Definera tydliga interfaces mellan modulerna så att du enkelt kan byta ut de mot andra ifall det inte fungerar.

Jag är ny på C++. Men jag kan Java.

Skrivet av KAD:

Enda sättet att veta om du vinner prestanda är nog att benchmarka två beräkningsprogram i de olika språken mot varandra.

Om webbgränssnittet och beräkningen alltid kör på samma burk kan man ju överväga andra tekniska gränssnitt än sockets, till exempel stdin/stdout, fil, JNI eller delat minne. Jag hade nog kört på stdin/stdout för att kunna köra beräkningsprogrammet oberoende av allt annat - men det har ju kostnaden att skapa en ny process för varje beräkning.

Jag har kollat C++ VS Java och sett att C++ är mycket snabbare vid t.ex Manelbrott algoritmen. 10 gånger snabbare!
https://benchmarksgame-team.pages.debian.net/benchmarksgame/f...

Väljer jag Java + C++ så betyder det att jag måste ha mer kod t.ex. sockets och någon process som skickar data mellan Java och C++. Detta tar ju tid också.
Väljer jag enbart Java så har jag ju enbart Java. Kommunikationen går ju lättare.

Algoritmer jag ska använda mig av är:

* Moore-Penrose pseudoinverse. Detta kan enkelt lösas med Singular Value Decomposition
* Euler-Methodför att simulera ODE via en for-loop. Totalt blir det 72*256 iterationer, vilket är 19456 iterationer.

Med GNU Octave löser jag detta hur enkelt som helst. Frågan om det är värt att använda optimerad GNU Octave kod jämfört med C++.

Jag gjorde ett test med pinv och en for-loop som itererar 72 gånger.

>> E = pinvreg(A, b); Elapsed time is 0.0118351 seconds. >> function E = pinvreg(X, Y) tic E = pinv(X,Y); for n = 1:72 Y = X*E; E = E + E*0; end toc endfunction

En tiondels sekund för att beräkna detta. Undra hur mycket jag vinner på att porta om allt detta till C++? GNU Octave är ju C++ i grunden också.

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Registrerad
Dec 2018

Java kan vara snabbt

@heretic16: Här har du några exempel på att Java kan vara ganska snabbt (alla tider gäller en Core 2 Quad).
Java vs C

Det har kan ju ha många fördelar att stanna i ett språk.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jul 2001

Varför spekulera, kan du inte börja bygga i java (språket du kan och vill skriva) och se om det är snabbt nog?

Vi lär aldrig kunna sitta här och gissa vad som snurrar snabbast på din hårdvara, för det är inte så enkelt att det bara är en fråga om C++ vs. Java. Det handlar om hur väl du skriver din kod, om det är något som kan optimeras vid runtime (till javas fördel) och det är också en fråga om vilken kompilator (och inställningar) respektive JVM (och inställningar).

Profiling, profiling, profiling.

Ubuntu | 1440p IPS | 7700k | 1080ti | 32GB@3.6GHz | 960 Pro 1TB | Xonar STX

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004

Man kan även använda till exempel Swig för att generera ett javagränssnitt till c++-funktionerna och därmed slippa socketar.

Trädvy Permalänk
Datavetare
Plats
Stockholm
Registrerad
Jun 2011

@heretic16: hur mycket flaskhals är beräkningarna?

Du nämner att plattformen är en RPi (gissar RPi3?).

Goda nyheten är att flyttalsprestanda har ökat rätt dramatiskt i Java mellan OpenJDK versioner.

Den dåliga nyheten är 300-350 MFLOPS ändå är rätt långt från vad som är tekniskt möjligt med en Cortex A53 runt 1 GHz.

Gjorde ett snabbskott med NumPy samt Octave (som använder samma matrisbibliotek i botten), där får man utan ansträngning 4-5 GFLOPS i matrisberäkningar, vilket är rätt mycket vad man kan hoppas på med välskriven NEON-optimerad kod (NEON är ARMs motsvarighet till x86 SSE/AVX).

Har inte använt Dlib, men det verkar vara optimerat för SIMD (d.v.s NEON på ARM och SSE/AVX på x86) så man kan nog vänta sig liknande prestanda som jag fick i NumPy och Octave.

edit: fast effekten av NEON i dlib verkar beror rätt mycket på vad man gör, så nog värt att göra ett provskott på just det du ska beräkna och ställa det mot Octave (då du verkar ha koll på Octave/Matlab).

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer