Citera eller @philipborg om du vill att jag ska läsa dina svar.
Vad skulle Java behöva göras som för att slå Python i PYPL-index?
Förvånad över att inte C# ligger högre.
Det är väl oftast C# man programmerar i för .NET utveckling i Windows miljö? Även C++ kanske... Utvecklingsmiljön Microsoft Visual Studio har ju en oerhört stark position inom Microsoft/Windows världen men denna undersökning avspeglar inte riktigt det faktumet.
Ja, Java (och Oracle) har nog skjutit sig själva rejält i foten med licensförändringen samt att Java har ett otroligt dåligt rykte som språk för klientprogram (applikationer) i Microsoft/Windows världen. Däremot i Unix/Linux/Enterprise världen och som server baserat programmeringsspråk används det fortfarande mycket.
Sedan är det kraftig skillnad på Java och Javascript. Javascript är populärt för webbutveckling och kommer nog vara så en lång tid framöver.
Blir lite rörigt med sådana här jämförelser tycker jag eftersom det är en stor skillnad mellan Microsoft/Windows samt Unix/Linux. Stor skillnad också mellan server baserad utveckling, klient baserad utveckling, applikationsutveckling, app utveckling för mobiler samt webbapplikationer.
Förvånad över att inte C# ligger högre.
I Sverige så är C# överrepresenterat gentemot andra länder. Så hade man bara tittat på Sverige så hade nog C# hamnat avsevärt mycket högre upp.
Sedan är det kraftig skillnad på Java och Javascript. Javascript är populärt för webbutveckling och kommer nog vara så en lång tid framöver.
Det är ju för att Java och Javascript är två helt olika språk. Anledningen till att det heter just Javascript var marketing och att det var tänkt att användas som glue-code för java-applets, men det har faktiskt ingenting med själva java som språk att göra.
Vad tror ni det kommer hända med Java när Java 14 släpps nu i Mars?
Java 14 sägs vara mycket ändringar i språket och effektiviseringar.
Java 14 kommer nog inte ändra så mycket. Records dyker upp som preview. Koden är alltså stabil och inte nån typ av beta men syntax/api kan fortfarande ändras i kommande version. Krävs en --enable-preview flaga för att kompilera.
Records i sig minskar mest mängden kod man behöver skriva för att definiera enkla klasser. Man slipper skriva egna equals/hashCode/toString/getters. Det är först när man kombinerar records med ett par andra saker som också är under utveckling, sealed types och pattern matching, som sättet man skriver java verkligen kommer börja ändras. Tillsammans får man en hyffsat kompakt syntax för att definiera och använda ADTs (Algebraic Data Types).
T.ex. en summa-typ som representerar ett AST (abstract syntax tree) för ett minimalt språk som innehåller ints, addition och multiplikation skulle kunna se ut ungefär så här:
sealed interface Expr
record Lit(int x) implements Expr
record Mul(Expr left, Expr right) implements Expr
record Add(Expr left, Expr right) implements Expr
int eval(Expr expr) {
return switch(expr) {
case Lit(x) -> x;
case Mul(l, r) -> eval(l) * eval(r);
case Add(l, r) -> eval(l) + eval(r);
};
}
Koden liknar hur man skulle skriva i funktionella språk som Haskell och Scala.
Förändringarna i syntax och själva språket java kommer från Project Amber. Andra saker som är på gång därifrån är t.ex. multi-line strings """ """ (preview i java 14) och lokala funktioner (definiera funktioner inuti andra funktioner).
En annan nyhet i Java 14 är foreign-memory API från Project Panama. Ett bättre och effektivare api för att hantera minne utanför jvm (off heap). Panama kommer göra det enklare och effektivare att använda C/C++ bibliotek från jvm språk och kommer ge nya möjligheter att skriva kod som är effektiv på modern hårdvara. Själv ser jag fram emot Vector API som gör det möjligt att skriva effektiv SIMD kod.
Andra stora förändringar som är på gång men som kommer dröja flera versioner är Project Loom och Project Valhalla.
Loom handlar om virtuella trådar (lättviktstrådar) och concurrency. Utan att behöva skriva om sin kod kommer man få fördelarna av Kotlins coroutines.
Valhalla handlar om inline types (value classes). Man kommer kunna skriva rena dataklasser med en effektivare minneslayout.
Tittar man på allt som är under utveckling så tycker jag att framtiden ser ljus ut för både java som språk och jvm som platform.
Kotlin är det självklara valet idag om man sysslar med androidutveckling och kommer antagligen fortsätta vara det. Är man bara ute efter ett "bättre java" kan det vara värt att testa Kotlin eller Scala idag men om ett par år kommer java som språk vara ett "bättre java". Är man intresserat av funktionell programmering så skulle jag rekommendera Scala även om det finns bra bibliotek som arrow-kt till Kotlin. Scala har ett mer avancerat typsystem och lite mer fokus på den typen av programmering. Dessutom är Scala 3 på väg om nåt år med många förbättringar.
Just exemplet jag tog kan också användas för att visa hur lite mikrobenchmarks faktiskt säger. Tittar man i C koden inser man att lika gärna kan kompilera det hela med "fast-math" (man använder inga finesser som inte finns när "fast-math" är påslaget), i det läget blir helt plötsligt C versionen mer än dubbelt så snabb! (så en riktigt typisk "mikrobenchmark", blir inte i närheten sådan utväxling i "verkliga" fall).
Siffrorna i din tabell är resultaten från en enkel brainfuck interpreter. Koden innehåller inte några flyttalsberäkningar så jag förstår inte alls vad -ffast-math skulle göra? Skriver du om någon helt annan test nu?
Siffrorna i din tabell är resultaten från en enkel brainfuck interpreter. Koden innehåller inte några flyttalsberäkningar så jag förstår inte alls vad -ffast-math skulle göra? Skriver du om någon helt annan test nu?
Länken till github-repo du hittade hade ju flertalet test, två handlade om brainfuck interpreter (de är väldigt snarlik men brainfuck2 har fler implementationsspråk).
Har tittat i alla, men i just matmul fallet var det lite förvånande att Java ändå tog ~dubbelt så mycket RAM då allt minne allokeras "up-front" och noll skräp skapas under körningen. Just detta fall hade lite andra "intressanta" egenheter, som t.ex. hur mycket snabbare man kunde få C-fallet att köra men det visade också att med "rätt" bibliotek kan ett språk som CPython3 helt plötsligt ta rätt lite minne och bli snabbas (fast orsaken är att det fanns en variant som använde NumPy som är skrivet i C++ och är SIMD-optimerat...).
Mätningarna för Kotlin vad det gäller ramåtgång kan bli totalt fel om man startar programmet med kotlin i stället för java -jar DE/DEN_JAR_SOM_BEHÖVS_FÖR_KOTLIN. Detta då kotlin, i alla fall när man använder den som finns i "snap" under Ubuntu, är en wrapper till den verkliga involveringen av java.
Helt klart verkar JetBrains sikta på lite andra fall jämfört med "standard" Java. De argument man skickar med gör att man offrar lite prestanda för mindre RAM-åtgång. Detta är "base64" testet med dels det benchmark-maskineriet använder (som är standard Java) samt det man får om man kolla vad kotlin wrappern gör
Go
encode: 1333333600, 1.6297
decode: 1000000000, 1.5035
3.15s, 198.2Mb
Cpp
encode: 1333333600, 2.71
decode: 1000000000, 2.27
4.98s, 68.0Mb
C
encode: 1333333600, 0.54
decode: 1000000000, 0.92
1.47s, 33.3Mb
C aklomp SSSE3
encode: 1333333600, 0.19
decode: 1000000000, 0.24
0.44s, 33.3Mb
Rust
encode: 1333333600, 0.826657805
decode: 1000000000, 0.986341872
1.82s, 46.5Mb
Python3 (CPython)
encode: 1333333600, 1.6845877170562744
decode: 1000000000, 3.7185170650482178
5.42s, 44.0Mb
Python3 (PyPy)
encode: 1333333600, 2.50448298454
decode: 1000000000, 3.85327196121
6.43s, 155.4Mb
Java
encode: 1333333600, 1.729370951
decode: 1000000000, 1.818882686
7.15s, 478.1Mb
[b]Kotlin (java utan speciella -X argument)
encode: 1333333600, 2.323045845
decode: 1000000000, 2.134581954
4.59s, 469.5Mb
Kotlin (java med de -X argument "kotlin" wrappen använder)
encode: 1333333600, 2.377413509
decode: 1000000000, 2.469078681
5.03s, 123.2Mb
Både Kotlin och än mer CPython vs PyPy visar här att man får lite välja mellan mer prestanda och mer RAM-åtgång alt. mindre RAM-åtgång men också mindre prestanda. Just i det här fallet är åter igen CPython3 snabb då det mesta sköts av ett bibliotek skrivet i C.
Just CPython kommer i väldigt nära 100 % fallen drar minimal mängd RAM givet förutsättningarna. Detta då man primärt baserar minneshanteringen på automatiskt referensräkning (precis som t.ex. Swift, det är bättre för "realtids-applikation"), traditionell GC används enbart för att hantera cirkulärreferenser.
PyPy kör däremot GC rakt av. Åter igen, det handlar mer om policy än språket i sig. CPython har just för RAM en policy som gör den plattformen vettig till och med för saker som mikrokontrollers (realtid handlar inte om att vara snabb, det handlar om att vara förutsägbar!).
Java (egentligen de typiska JVM-implemenationerna) och realtid är direkt oanvändbara i realtidsfall. De är helt optimerade för maximal genomsnittlig throughput (vilket är vettigt givet typisk användning)!
TL;DR är dock fortfarande "humor" då CPythons användning av ARC+GC dels visar att man rejält tänkt på just RAM och ställt mot Java med typisk JVM kommer ett likvärdigt CPython alltid dra lika eller mindre RAM än Java programmet.
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Länken till github-repo du hittade hade ju flertalet test, två handlade om brainfuck interpreter (de är väldigt snarlik men brainfuck2 har fler implementationsspråk).
Har tittat i alla, men i just matmul fallet var det lite förvånande att Java ändå tog ~dubbelt så mycket RAM då allt minne allokeras "up-front" och noll skräp skapas under körningen. Just detta fall hade lite andra "intressanta" egenheter, som t.ex. hur mycket snabbare man kunde få C-fallet att köra men det visade också att med "rätt" bibliotek kan ett språk som CPython3 helt plötsligt ta rätt lite minne och bli snabbas (fast orsaken är att det fanns en variant som använde NumPy som är skrivet i C++ och är SIMD-optimerat...).
Matmul testet jämför helt andra saker än skillnaden mellan språk och är därför ointressant. Koden är väldigt långsamt och naivt skriven i de flesta språk förutom tex python där koden är skriven i ett annat språk än python av experter.
Att C koden blir snabbare med -ffast-math är inte det minsta konstigt och precis vad man kan förvänta sig. ffast-math tillåter kompilatorn att räkna flyttalsoperationer som associativa vilket är ett krav för autovektorisering. Släng på -march=native/skylake också så används effektivare instruktioner och bredare register. funroll-loops borde också hjälpa. Även om programmet blir snabbare så är resultatet fortfarande uruselt och inte ens i närheten av vad man borde se med bättre skriven kod (som tar hänsyn till register/cache användning). Ett 3 gånger snabbare program är fortfarande 10 gånger långsammare än numpy. Det visa tydligt att det är koden det är fel på och det helt enkelt är en dålig test som det inte går att utläsa någon som helst information ur.
Helt klart verkar JetBrains sikta på lite andra fall jämfört med "standard" Java. De argument man skickar med gör att man offrar lite prestanda för mindre RAM-åtgång. Detta är "base64" testet med dels det benchmark-maskineriet använder (som är standard Java) samt det man får om man kolla vad kotlin wrappern gör
Nej det handlar inte alls om att JetBrains siktar på andra fall. Det är ytterligare ett exempel på att man mäter helt olika saker. Man jämför inte språken utan man jämför olika inställningar för gc i jvm. Det handlar inte om skillnader eller olika prioriteringar i språken utan vilka inställningar man startar med. XX:+UseSerialGC resulterar antagligen i ännu mindre använt minne osv.
Man kan i princip ignorera alla siffror för java, scala och kotlin i den här testen. Titta i koden hur man mäter tid och värmer upp JITen. Vill man ha siffror som betyder något så använder man JMH och dessutom bör man ha koll på hur man mäter och hur jvm jit fungerar.
Java (egentligen de typiska JVM-implemenationerna) och realtid är direkt oanvändbara i realtidsfall. De är helt optimerade för maximal genomsnittlig throughput (vilket är vettigt givet typisk användning)!
Om man ignorerar varianter av java som körts på allt från medicinsk utrusning till vapensystem och bara pratar om OpenJDK så stämmer det att java inte används till hard realtime. Däremot fungerar java bra för soft realtime (99.9..% för ett visst antal nior under en viss svarstid). Man har tom använt java inom HFT.
Nu för tiden finns det två GC som är optimerade för low latency som ingår i OpenJDK, ZGC och Shenandoah. ZGC håller sig runt 1.5ms som max paustid oavsett storlek på heap vilket gör att man faktiskt kan använda gc utan problem för många applikationer. Vill man ner ännu lägre i svarstider så får man programmera på ett helt annat sätt. Låta bli gc/allokering, skriva java som mer liknar c och även ta till andra trick som att isolera kärnor osv. Då kan man komma ner till 10-20us området för paket in -> beräkning/beslut -> paket ut i ren java kod. Vill man mycket lägre än det handlar det inte längre om valet mellan java, c++ eller rust.
- [LEK] Gissa spelet18k
- Hjälp med att återställa ett facebook-konto0
- Rykte: AMD siktar på prestandaklass med nästa generations Radeon23
- Billigast med bil till Tyskland?36
- Akut dator åt morsan18
- Ingen respons från Webhallen106
- Var hittar man magnetiska kabelhållare like de som LTT Store säljer?4
- Portabel AC inför sommaren [Samlingstråd]5,6k
- Köpråd gamingburk + skärm (10-12k?)4
- Ny emulator kör Steam och spel på RISC‑V-processorer21
- Säljes Äldre speldator (10600k/2070)
- Säljes Massa spelkoder till salu
- Säljes Ryzen 5 3600
- Säljes Server: HP ProLiant DL360 Gen9
- Säljes ECO-DIM.07 Smarta dimmers
- Bytes har: byte 34” uw oled, söker: 32” 4k oled
- Säljes Fractal Design Node 304
- Säljes Nintendo switch V1
- Säljes Gopro 3 utan batteri & annat smått jox
- Säljes Beast X Max Purple Solid Sides
- Överklockad Threadripper Pro 9995WX når 947 watt6
- Rykte: AMD siktar på prestandaklass med nästa generations Radeon23
- Snabbkoll: Hjälper du nära och kära med teknikköp?34
- Nya Intel-grafikkort närmar sig14
- Handskriven assembler snabbar upp kod21
- Ny emulator kör Steam och spel på RISC‑V-processorer21
- Kommentar: Forumet är dåtiden och framtiden23
- Elsparkcykel från F1-ingenjörer når 160 knyck59
- Microsoft slutar sälja film och serier29
- Programmerare besegrar Chat GPT i kodmaraton65
Externa nyheter
Spelnyheter från FZ
- Ghost of Yōtei blir ungefär lika långt som föregångaren idag
- Inofficiell FPS-remake av Necropolis från första Fallout får en trailer idag
- FZ High Score – Robocop är låst! idag
- Ubisoft uttalar sig om Stop Killing Games idag
- Battlefield 6 sägs avtäckas den 29:e juli under ett tre dagars långt event igår