NAVIGATIE

Freetime overzicht
Zoeken


  RUBRIEKEN

FAQ / Help
Wat mag niet?
WZL Wedstrijden
WZL Chat
WZL Toolbar
WZL Statistieken
WZL leden
WZL shop
E-cards

RSS

Fun-feed
Babe-feed
Stud-feed

Een groot aantal pokerrooms geven de mogelijkheid om poker te spelen op internet en geld te storten via het veilige iDeal betaalsysteem.
Overzicht » Computer » Programmeren » goede of slechte java code
Onderaan pagina
dannyboy 3.329
wzl-lid
Sinds 31/5/2005
T: 108 R: 883
15/11/2008 - 22:02u | Quote
Hoi hoi,

ik programeer graag in java en wil vragen welk van de 2 principes hier onder ik het best kan gebruiken.

String test;
while (blabla) {
test = "telkensietsanders";
doeIetsMetTest(test);
}


of

while (blabla) {
String test = "telkensietsanders";
doeIetsMetTest(test);
}


met andere woorden: is het beter om voor een loop de variabele aan te maken en die dan te herbruiken tijdens elke loop, of is het beter om in de loop gewoon telkens de variabele aan te maken (of zijn de 2 voorbeelden hetzelfde). Ik bedoel beter in termen van sneller, minder belastend voor geheugen, ...
Quagmire 3.748
wzl-lid
Sinds 18/11/2003
T:62 - R:1458
16/11/2008 - 1:11u | Quote
De eerste versie is in principe beter denk ik....

Alhoewel het zeer de vraag is of het in de praktijk iets uitmaakt aangezien ge (denk ik) toch wel moogt veronderstellen dat moderne compilers zelf zo'n dingen detecteren en optimaliseren....

Laatst aangepast door Quagmire op 16/11/2008 1:12:04u (1x aangepast)
lordfragger
[mod], gewoon [mod]
Sinds 28/6/2004
T:15 - R:3135
16/11/2008 - 15:50u | Quote
Het heeft alletwee eigenlijk een andere werkign ook eh. In het eerste geval is uwe variabele buiten uwe loop beschikbaar, in het 2de geval alleen binnen de loop. Het hangt er dus in feite vanaf waarvoor ge em nodig hebt.
dannyboy 3.329
wzl-lid
Sinds 31/5/2005
T:108 - R:883
16/11/2008 - 21:41u | Quote
lordfragger schreef:
Het heeft alletwee eigenlijk een andere werkign ook eh. In het eerste geval is uwe variabele buiten uwe loop beschikbaar, in het 2de geval alleen binnen de loop. Het hangt er dus in feite vanaf waarvoor ge em nodig hebt.

dat weet ik, maar stel dat ik alleen binnen de loop de variabele nodig heb. Ik zou dan de string ook rechtstreeks als argument meegeven aan de method, zoals hier:

while (blabla) {
doeIetsMetTest("telkensietsanders";
}


maar als het dan een tijdrovend proces is om aan die string te geraken en ik deze meerdere malen nodig heb binnen de loop. Welk van deze 2 kan ik dan best gebruiken


String test;
while (blabla) {
test = klasse.ditDuurtHeelLang();
doeIetsMetTest(test);
doeNogIetsMetTest(test);
doeEenDerdeDingMetTest(test);
}


of


while (blabla) {
String test = klasse.ditDuurtHeelLang();
doeIetsMetTest(test);
doeNogIetsMetTest(test);
doeEenDerdeDingMetTest(test);
}


Ik denk niet dat er veel verschil is tussen deze 2, maar ik ben een perfectionist en wil de snelste en/of minst belastende manier gebruiken
ka0z 2.996
wzl-lid
Sinds 30/9/2004
T:8 - R:60
17/11/2008 - 0:39u | Quote
dannyboy schreef:
lordfragger schreef:
Het heeft alletwee eigenlijk een andere werkign ook eh. In het eerste geval is uwe variabele buiten uwe loop beschikbaar, in het 2de geval alleen binnen de loop. Het hangt er dus in feite vanaf waarvoor ge em nodig hebt.

dat weet ik, maar stel dat ik alleen binnen de loop de variabele nodig heb. Ik zou dan de string ook rechtstreeks als argument meegeven aan de method, zoals hier:

while (blabla) {
doeIetsMetTest("telkensietsanders";
}


maar als het dan een tijdrovend proces is om aan die string te geraken en ik deze meerdere malen nodig heb binnen de loop. Welk van deze 2 kan ik dan best gebruiken


String test;
while (blabla) {
test = klasse.ditDuurtHeelLang();
doeIetsMetTest(test);
doeNogIetsMetTest(test);
doeEenDerdeDingMetTest(test);
}


of


while (blabla) {
String test = klasse.ditDuurtHeelLang();
doeIetsMetTest(test);
doeNogIetsMetTest(test);
doeEenDerdeDingMetTest(test);
}


Ik denk niet dat er veel verschil is tussen deze 2, maar ik ben een perfectionist en wil de snelste en/of minst belastende manier gebruiken


ben geen specialist maar ik gok da et 1ste beter is (string test; buiten loop)
m0rPh3uS 3.172
WZL-lid
Sinds 13/1/2003
T:1 - R:38
17/11/2008 - 13:40u | Quote
Verschil is dat in versie 2 van je code telkens opnieuw een stukje geheugen wordt gealloceerd om de waarde van 'String test' in bij te houden. Bij versie 1 is dat niet zo; je alloceert één keer een stukje geheugen (bij de declaratie van de variabele) en gaat telkens een andere waarde in deze plaats steken. Vergeet ook niet dat 'String' een speciaal datatype is dat men 'immutable' noemt (meer info).

Maar ik denk dat het op zich niet veel gaat uitmaken als je een lus 10, 100 of zelfs 1000 keer uitvoert. 't Is pas bij een veelvuldig gebruik dat dit iets gaat uitmaken.

Hope this helps.
dannyboy 3.329
wzl-lid
Sinds 31/5/2005
T:108 - R:883
17/11/2008 - 20:04u | Quote
m0rPh3uS schreef:
Verschil is dat in versie 2 van je code telkens opnieuw een stukje geheugen wordt gealloceerd om de waarde van 'String test' in bij te houden. Bij versie 1 is dat niet zo; je alloceert één keer een stukje geheugen (bij de declaratie van de variabele) en gaat telkens een andere waarde in deze plaats steken. Vergeet ook niet dat 'String' een speciaal datatype is dat men 'immutable' noemt (meer info).

Maar ik denk dat het op zich niet veel gaat uitmaken als je een lus 10, 100 of zelfs 1000 keer uitvoert. 't Is pas bij een veelvuldig gebruik dat dit iets gaat uitmaken.

Hope this helps.

Ok, dit help al een beetje, maar persoonlijk vind ik het belachelijk en onoverzichtig om een object, dat ik alleen in de lus ga gebruiken, voor de loop ga declareren. Zorgt java er niet automatisch voor dat het stukje gealloceerd geheugen terug vrijgegeven wordt, als ik in de volgende doorloop van de lus terug een string aanmaak met dezelfde naam als de vorige keer? of moet ik effectief zeggen test = null; op het einde van elke doorloop van de lus? Of is dit zelfs niet genoeg om het stukje geheugen terug vrij te geven?

Laatst aangepast door dannyboy op 17/11/2008 20:06:02u (1x aangepast)
Quagmire 3.748
wzl-lid
Sinds 18/11/2003
T:62 - R:1458
17/11/2008 - 20:29u | Quote
of moet ik effectief zeggen test = null; op het einde van elke doorloop van de lus? Of is dit zelfs niet genoeg om het stukje geheugen terug vrij te geven?


Als ge uw variabele declareert binnen de lus heeft het sowieso geen zin om die op null te zetten omdat uwe stack dan toch "ge-popped" wordt, dus wat ge daarvoor zelf nog doet met die variabele zal niet veel uitmaken....

Sowieso, als gij een variabele op "null" instelt dan wordt het geheugen daarom niet per definitie vrijgegeven... Dit gebeurt pas wanneer de garbage collector in gang schiet en dat is iets waar gij als programmeur in de regel weinig of geen controle over hebt aangezien de hele bedoeling van dat systeem is dat gij u niks meer moet aantrekken van het vrijgeven van geheugen....

Ge kunt in principe wel zelf ne collect forceren, maar dat kost meer resources dan ge daar ooit mee gaat uitsparen....

En zoals ik eerder al zei..... volgens mij gaat de java compiler echt wel zelf de optimalisatie doorvoeren om uw variabele buiten de lus te brengen bij het compileren.
dannyboy 3.329
wzl-lid
Sinds 31/5/2005
T:108 - R:883
17/11/2008 - 20:38u | Quote
Quagmire schreef:
of moet ik effectief zeggen test = null; op het einde van elke doorloop van de lus? Of is dit zelfs niet genoeg om het stukje geheugen terug vrij te geven?


Als ge uw variabele declareert binnen de lus heeft het sowieso geen zin om die op null te zetten omdat uwe stack dan toch "ge-popped" wordt, dus wat ge daarvoor zelf nog doet met die variabele zal niet veel uitmaken....

Sowieso, als gij een variabele op "null" instelt dan wordt het geheugen daarom niet per definitie vrijgegeven... Dit gebeurt pas wanneer de garbage collector in gang schiet en dat is iets waar gij als programmeur in de regel weinig of geen controle over hebt aangezien de hele bedoeling van dat systeem is dat gij u niks meer moet aantrekken van het vrijgeven van geheugen....

Ge kunt in principe wel zelf ne collect forceren, maar dat kost meer resources dan ge daar ooit mee gaat uitsparen....

En zoals ik eerder al zei..... volgens mij gaat de java compiler echt wel zelf de optimalisatie doorvoeren om uw variabele buiten de lus te brengen bij het compileren.

Dit was hulpvol, bedankt Ik ga nog wel kijken of er nog een second opinion hier wordt gecomment. Niks persoonlijk, gewoon verificatie van het door u gestelde principe.
Quagmire 3.748
wzl-lid
Sinds 18/11/2003
T:62 - R:1458
17/11/2008 - 23:14u | Quote
Niks persoonlijk, gewoon verificatie van het door u gestelde principe.


mja..... ik ben ook eens benieuwd of iemand anders kan bevestigen wat ik er allemaal uitflap
Zubzub 2.604
wzl-lid
Sinds 30/7/2005
T:2 - R:176
18/11/2008 - 1:22u | Quote
m0rPh3uS schreef:
Verschil is dat in versie 2 van je code telkens opnieuw een stukje geheugen wordt gealloceerd om de waarde van 'String test' in bij te houden. Bij versie 1 is dat niet zo; je alloceert één keer een stukje geheugen (bij de declaratie van de variabele) en gaat telkens een andere waarde in deze plaats steken. Vergeet ook niet dat 'String' een speciaal datatype is dat men 'immutable' noemt (meer info).

Maar ik denk dat het op zich niet veel gaat uitmaken als je een lus 10, 100 of zelfs 1000 keer uitvoert. 't Is pas bij een veelvuldig gebruik dat dit iets gaat uitmaken.

Hope this helps.

Ja en nee

eigenlijk zijn beide voorbeelden hetzelfde qua performance ik zou dus persoonlijk voor het 2de gaan (variabelen die alleen in de lus nodig zijn worden alleen in de lus gedeclareerd). Wat er eigenlijk gebeurt is dit:

String test alloceert een string pointer met waarde null. in de lus wordt deze pointer telkens "opgevuld" met een waarde en behoud de string test de laatste waarde die er aan gegeven is na de loop. Maw je moet expliciet test = null zette opdat de garbage collecter hem zou kunnen opruimen nadat de lus is beeindigd.

Bij het tweede wordt er telkens een nieuw pointer met waarde "telkensietsanders" aangemaakt maar wordt deze pointer inc waarde ook telkens weer verwijderd. Een loop van een lus wordt immers uitgevoerd in een apart stuk geheugen (stack) en telkens gereset bij het begin van een nieuw lus.

Ik zou dus persoonlijk voor het tweede gaan.


Laatst aangepast door Zubzub op 18/11/2008 1:23:40u (2x aangepast)
dannyboy 3.329
wzl-lid
Sinds 31/5/2005
T:108 - R:883
18/11/2008 - 8:58u | Quote
Zubzub schreef:
m0rPh3uS schreef:
Verschil is dat in versie 2 van je code telkens opnieuw een stukje geheugen wordt gealloceerd om de waarde van 'String test' in bij te houden. Bij versie 1 is dat niet zo; je alloceert één keer een stukje geheugen (bij de declaratie van de variabele) en gaat telkens een andere waarde in deze plaats steken. Vergeet ook niet dat 'String' een speciaal datatype is dat men 'immutable' noemt (meer info).

Maar ik denk dat het op zich niet veel gaat uitmaken als je een lus 10, 100 of zelfs 1000 keer uitvoert. 't Is pas bij een veelvuldig gebruik dat dit iets gaat uitmaken.

Hope this helps.

Ja en nee

eigenlijk zijn beide voorbeelden hetzelfde qua performance ik zou dus persoonlijk voor het 2de gaan (variabelen die alleen in de lus nodig zijn worden alleen in de lus gedeclareerd). Wat er eigenlijk gebeurt is dit:

String test alloceert een string pointer met waarde null. in de lus wordt deze pointer telkens "opgevuld" met een waarde en behoud de string test de laatste waarde die er aan gegeven is na de loop. Maw je moet expliciet test = null zette opdat de garbage collecter hem zou kunnen opruimen nadat de lus is beeindigd.

Bij het tweede wordt er telkens een nieuw pointer met waarde "telkensietsanders" aangemaakt maar wordt deze pointer inc waarde ook telkens weer verwijderd. Een loop van een lus wordt immers uitgevoerd in een apart stuk geheugen (stack) en telkens gereset bij het begin van een nieuw lus.

Ik zou dus persoonlijk voor het tweede gaan.

OK, nu ben ik volledig overtuigd. Ik ga het 2de principe gebruiken.

Merci iedereen voor de hulp
m0rPh3uS 3.172
WZL-lid
Sinds 13/1/2003
T:1 - R:38
19/11/2008 - 16:08u | Quote
Zubzub schreef:
m0rPh3uS schreef:
...

Ja en nee

eigenlijk zijn beide voorbeelden hetzelfde qua performance ik zou dus persoonlijk voor het 2de gaan (variabelen die alleen in de lus nodig zijn worden alleen in de lus gedeclareerd). Wat er eigenlijk gebeurt is dit:

String test alloceert een string pointer met waarde null. in de lus wordt deze pointer telkens "opgevuld" met een waarde en behoud de string test de laatste waarde die er aan gegeven is na de loop. Maw je moet expliciet test = null zette opdat de garbage collecter hem zou kunnen opruimen nadat de lus is beeindigd.

Bij het tweede wordt er telkens een nieuw pointer met waarde "telkensietsanders" aangemaakt maar wordt deze pointer inc waarde ook telkens weer verwijderd. Een loop van een lus wordt immers uitgevoerd in een apart stuk geheugen (stack) en telkens gereset bij het begin van een nieuw lus.

Ik zou dus persoonlijk voor het tweede gaan.

Ok, maar het gaat hier wel over performantie. Volgens mij is het nog altijd sneller om één stukje geheugen éénmaal te alloceren en daar telkens een nieuwe waarde in te droppen, dan elke keer een dat stukje geheugen te alloceren en terug vrij te geven. Ok, deze waarden worden wel sneller opgeruimd door de GC, maar het proces is toch intensiever volgens mij.

Daarentegen vind ik optie 2 ook overzichtelijker; zoals je zegt: variabelen die je enkel in een lus nodig hebt, ook daar declareren. Maar vanuit een performantiestandpunt lijkt mij optie 1 toch beter.

Regards.
Zubzub 2.604
wzl-lid
Sinds 30/7/2005
T:2 - R:176
8/12/2008 - 17:03u | Quote
m0rPh3uS schreef:
Zubzub schreef:
m0rPh3uS schreef:
...

Ja en nee

eigenlijk zijn beide voorbeelden hetzelfde qua performance ik zou dus persoonlijk voor het 2de gaan (variabelen die alleen in de lus nodig zijn worden alleen in de lus gedeclareerd). Wat er eigenlijk gebeurt is dit:

String test alloceert een string pointer met waarde null. in de lus wordt deze pointer telkens "opgevuld" met een waarde en behoud de string test de laatste waarde die er aan gegeven is na de loop. Maw je moet expliciet test = null zette opdat de garbage collecter hem zou kunnen opruimen nadat de lus is beeindigd.

Bij het tweede wordt er telkens een nieuw pointer met waarde "telkensietsanders" aangemaakt maar wordt deze pointer inc waarde ook telkens weer verwijderd. Een loop van een lus wordt immers uitgevoerd in een apart stuk geheugen (stack) en telkens gereset bij het begin van een nieuw lus.

Ik zou dus persoonlijk voor het tweede gaan.

Ok, maar het gaat hier wel over performantie. Volgens mij is het nog altijd sneller om één stukje geheugen éénmaal te alloceren en daar telkens een nieuwe waarde in te droppen, dan elke keer een dat stukje geheugen te alloceren en terug vrij te geven. Ok, deze waarden worden wel sneller opgeruimd door de GC, maar het proces is toch intensiever volgens mij.

Daarentegen vind ik optie 2 ook overzichtelijker; zoals je zegt: variabelen die je enkel in een lus nodig hebt, ook daar declareren. Maar vanuit een performantiestandpunt lijkt mij optie 1 toch beter.

Regards.


Om nog ff te muggenziften

in het eerste voorbeeld is test een pointer zonder geheugenverwijzing (een nullpointer), je gaat dus ook geen geheugen alloceren maw een lege 32/64 bit geheugenverwijzing (geheugen alloceren voor een object gebeurt pas bij de constructor). In de lus wordt de waarde van test een geheugenplaats waar de waarde "telkensietsanders" zich bevindt. Maar, nu komt het , String is een immutable java object. Dit wil zegge dat als ik een nieuwe waarde aan test geef ik ook telkens nieuw geheugen reserveer en het oude geheugen dus niet overschrijf en het opruimen overlaat aan de garbage collector. In het 2de geval gebeurt dit ook maar moet ik gewoon na het beindigen van de lus de variabele test niet op null zette want ik zit al buiten mijn lus (wat in het eerste voorbeeld dus wel moet wil ik het geheugen vrijgeven). Beide zijn dus even performant. Als je toch perse aan performantere string manipulatie wil doen gebruik dan een StringBuffer.
Berrepoot 4.389
wzl-lid
Sinds 2/7/2008
T:0 - R:6
16/12/2008 - 14:46u | Quote
Ik zie deze post nu pas dus sorry voor de late reactie, maar Zubzub heeft wel degelijk gelijk.
Als de variabele buiten de loop gedeclareerd wordt wil dit absoluut niet zeggen dat deze waarde telkens wordt overschreven in het geheugen. Het enige wat er overschreven wordt is de pointer naar het geheugen! En dit is dus in feite net hetzelfde als de 2e manier!
Wat wel verschilt is (zoals Zubzub) zegt, dat je bij de 1e manier zelf je variabele op "null" moet zetten. Vandaar dat ik zou zeggen dat de 2e manier de beste is. Niet zozeer voor de performantie maar deze is gewoon "properder".
 
Bovenaan pagina