We gaan nu wel aardig offtopic denk ik, maar ondanks dat het maar een voorbeeld was, zijn dus juist dit soort scenarios optimaliseren iets waar Java erg goed in is. De JVM zal bv alleen de methodes compileren die daadwerkelijk worden gebruikt i.p.v. de hele reeks mee te nemen. Dit is niet alleen een kwestie van "lui programmeren," maar een feature van veel moderne programmeertalen, inclusief C++ (compiler). De performance verliezen zitten hem vaak in het gemak waarmee je bepaalde scenarios kunt tackelen, maar waarbij niet ieder scenario de ideale manier zou zijn.
Wat betreft cross-platform efficiency, Java's ontwerp maakt het mogelijk om efficiënt te draaien op verschillende platforms zonder aanzienlijk verlies van prestaties. De JVM is geoptimaliseerd voor verschillende CPU-architecturen en gebruikt Just-In-Time (JIT) compilatie om platformspecifieke optimalisaties te bereiken.
Jouw voorbeeld van bibliotheken in C++ en Java is interessant en relevant, maar het is belangrijk op te merken dat beide talen over uitgebreide helpers en imports beschikken. De efficiëntie hangt in bijna alle gevallen nog altijd af van hoe de ontwikkelaar deze gebruikt.
Stel je hebt bv een een lijst van objecten, getallen, etc. Je kunt die lijst eenmalig sorteren (en bij nieuwe toevoegingen aan de collectie, deze direct op de juiste plek plaatsen), en als zijnde gesorteerd bewaren, of bij iedere aanroep naar die lijst onderwater een nieuwe lijst zitten te maken die je bij iedere aanroep dan ook weer opnieuw zit te sorteren. Dat laatste viel mij al op tijdens mijn studie. Zo heb ik medestudenten data zien ophalen uit een database (inclusief een sortering in de aanroep), om deze dan weer in de applicatie nog eens iedere keer te gaan sorteren in het geheugen alvorens deze werden gepresenteerd in een UI, website etc, en dat dus bij iedere interactie met het tabblad, pagina, ... werd dit opnieuw uitevoerd, terwijl als je die lijst gewoon eenmalig zou ophalen, om deze daarna binnen je applicatie bij te houden en je alleen de wijzigingen rechtstreeks terug zou sturen naar de opslag, je misschien nog niet eens 1/100e van de compute nodig zou hebben.
Dit soort simpele, en zeer niet optimale, scenarios komen vaker voor bij mensen die weinig moeite steken in de daadwerkelijke werking van de helper methodes die ze gebruiken. Het gaat daarmee dus vaak meer om het inzicht en de inzet van de ontwikkelaar dan de taal zelf. Mensen die zelf de desbetreffende helpers schrijven, al zou je dan nog kunnen discussiëren over de kwesite of deze persoon een betere versie gaat schrijven dan een generieke implementatie waar al honderden ogen naar hebben gekeken (wat wel kan overigens, als je specifieke code voor jouw specifieke scenario zou schrijven), zullen sowieso sneller door hebben wat hun code doet, dus dan komt die optimalisatie eigenlijk in de meeste gevallen vanzelf wel tot de realiteit.
[Reactie gewijzigd door Paprika op 22 juli 2024 15:44]