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

Permalänk

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.

Permalänk
Vila i frid

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

Permalänk
Medlem

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.

Permalänk
Medlem

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.

Permalänk
Medlem

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.

Permalänk
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å.

Permalänk

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.

Permalänk
Medlem

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.

Visa signatur

Arch | 1440p 165Hz IPS | 7800X3D | 1080ti | 64GB@6GHz | SN850 2TB

Permalänk
Hedersmedlem

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

Permalänk
Datavetare

@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).

Visa signatur

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