Devblog / portfolio
Swords & Soldiers
Awesomenauts
Proun
Cello Fortress
Asus A7N8X-X, AMD XP2400+, 2.5GB Infineon+Samsung DDR333, Radeon x1600 Pro, 2x Fujitsu MAP3735NC 10Krpm SCSI 73GB, Seagate Medalist 17.2GB, LiteOn DVD 16x48x, LiteOn 48x12x48, Promise UDMA100/TX2, Adaptec 2110S Ultra3, 2x EIZO FlexScan (F931 & F930)
arr[0].length bevind je je op glad ijs. Neem dit volgende stukje (smerige!) code1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| public class Test { public static void main( String[] args ) { // create our array Object[] arr = new Object[10]; for( int i = 0; i < arr.length; i++ ) { arr[i] = new Object[i]; } // Now print length's for( int i = 0; i < arr.length; i++ ) { Object[] arrVar = (Object[])arr[i]; System.out.println( arrVar.length ); } } } |
Gebruik aub ArrayLists, LinkedLists en HashMaps waar dat kan en array's zo weinig mogelijk
Maar als je hem zelf instantieert en je zeker weet dat je daar verder niets aan verandert is het toch niet zo erg? Moet zelf op zich ook wel gebruik maken van arrays op dit moment en ik weet gewoon dat bij sommige arrays idd de tweede dimensie per index een andere lengte kan hebben. Zolang ik dit niet vergeet (Glimi schreef op 06 July 2003 @ 22:02:
Kijk uit waar je mee bezig bent! Met <code>arr[0].length</code> bevind je je op glad ijs. Neem dit volgende stukje (smerige!) code
<... knip ...>
Gebruik aub ArrayLists, LinkedLists en HashMaps waar dat kan en array's zo weinig mogelijk
Zijn normale arrays overigens niet sneller dan elk van de andere opties die jij noemt?
Aviation is proof that given the will, we have the capacity to achieve the impossible.
--Eddie Rickenbacker
Waarschijnlijk wel, maar waarom zou je je als Java-programmeur zorgen maken over snelheid? Ik bedoel dat niet als sneer; blijkbaar heb je goede redenen om voor het Java platform te kiezen en je bent bereid om daar executiesnelheid voor in te leveren (want laten we wel zijn, Java is traag). Waarom zou je je nu druk maken over het marginale snelheidsverschil tussen arrays en Collection classes?hammerhead schreef op 06 juli 2003 @ 23:50:
Zijn normale arrays overigens niet sneller dan elk van de andere opties die jij noemt?
Waar denk je die arrays voor te gebruiken? Denk je dat je een merkbaar verschil in executiesnelheid gaat krijgen? Er zijn natuurlijk scenario's te construeren waarin dit wel het geval is, maar waarschijnlijk is jouw situatie daar niet één van.
word of warning: Java is geen C - omdat je [][] wil dit niet zeggen dat je een rechthoekige array hebt. (WEL als je hem zoals hierboven def) maar een x[][] kan ookOogst schreef op 06 July 2003 @ 21:02:
int [] [] array = new int [500] [300];
En daarvan wil ik de breedte en de lengte te weten komen, dus zoiets als:
[[1,2],[1,2,3],[1,2,3,4]] zijn.
wel grappig vind ik dat je de width+heigth wil hebben terwijl je die klaarblijkelijk al kent. (ie 500x300).
Tis allemaal wat je wil doen met je array. Als je een bitmap hebt zou ik alvast geen [][] doen maar een [offset*y+x].
Je, je, je. Je moet generieke code schrijven en niet zulke aannames makenhammerhead schreef op 06 July 2003 @ 23:50:
Maar als je hem zelf instantieert en je zeker weet dat je daar verder niets aan verandert is het toch niet zo erg? (...)
Normale array's doen ook boundchecks, dus eigenlijk grofweg zit er alleen een methodcall tussen en enkele checks. Nou, da's nou niet echt zoveel werk hoorZijn normale arrays overigens niet sneller dan elk van de andere opties die jij noemt?
Tevens gaat de resize ook maar soms door (1/N) keer en dat gaat in O(n) tijd. Als jij je N goed kiest (Max elems) dan gaat ook een ArrayList in O(1) tijd, net als een array
Soultaker schreef op 07 July 2003 @ 01:25:
[...]
Waarschijnlijk wel, maar waarom zou je je als Java-programmeur zorgen maken over snelheid? (...)
*kuch* [rml]Glimi in "[ JAVA] Lengte van meerdimensionale array"[/rml]
Een scenario wat ik op zich wel kan bedenken is het gebruik maken van een array van integers. Als ik gebruik maak van een normale array is dit vermoedelijk sneller dan dat ik voor elk element een Integer object moet instantieren om in een ArrayList of elk van de andere mogelijkheden te zetten. Of je moet me nu een zeer goede tip kunnen geven wat sneller en beter is om te gebruiken om een 2 Dimensionale lijst van integers te representeren (grootte is ongeveer 150 x 40).Soultaker schreef op 07 July 2003 @ 01:25:
[...]
Waar denk je die arrays voor te gebruiken? Denk je dat je een merkbaar verschil in executiesnelheid gaat krijgen? Er zijn natuurlijk scenario's te construeren waarin dit wel het geval is, maar waarschijnlijk is jouw situatie daar niet één van.
Naar mijn mening is die code best generiek. De arrays worden bij de start van mijn programma geinitialiseerd met de juiste breedtes die uit het invoerbestand wordt gehaald. Deze breedtes lees ik zelf ook in een variabelen in dus het is vrij makkelijk bij te houden wat de breedte van een bepaalde regel in mijn array is.Glimi schreef op 07 July 2003 @ 09:50:
[...]
Je, je, je. Je moet generieke code schrijven en niet zulke aannames makenAnders is uw code niet goed herbruikbaar. Aannames moet je anders afdwingen
maar dan met zo'n controle ben je ook O(n) tijd kwijt (worst case), dus sneller zal het niet echt zijn (wel in z'n constante
)
Aviation is proof that given the will, we have the capacity to achieve the impossible.
--Eddie Rickenbacker
Is het dan mogelijk om niet-vierkant prim. array's te maken...hammerhead schreef op 07 July 2003 @ 10:36:
Een scenario wat ik op zich wel kan bedenken is het gebruik maken van een array van integers. (...)
Kijk verder dan je eigen code. Als ik een programma heb waarin ik een niet-vierkante array heb en gebruik uw code, dan zal het dus niet werkenNaar mijn mening is die code best generiek. De arrays worden bij de start van mijn programma geinitialiseerd met de juiste breedtes die uit het invoerbestand wordt gehaald. (...)
Dat is inderdaad een zinnig scenario. Overigens illustreert dat meer de noodzaak voor programmeurs om om het brakke typesysteem van Java heen te werken, dan dat die array echt beter is dan een Collection object. Als er een IntVector zou bestaan (waar ik dus ints in kan mikken) zou ik die bijvoorbeeld liever gebruiken dan arrays van ints, maar ja... die zou je dan zelf moeten schrijven, en dat is ook weer zo wat.hammerhead schreef op 07 July 2003 @ 10:36:
Een scenario wat ik op zich wel kan bedenken is het gebruik maken van een array van integers. Als ik gebruik maak van een normale array is dit vermoedelijk sneller dan dat ik voor elk element een Integer object moet instantieren om in een ArrayList of elk van de andere mogelijkheden te zetten. Of je moet me nu een zeer goede tip kunnen geven wat sneller en beter is om te gebruiken om een 2 Dimensionale lijst van integers te representeren (grootte is ongeveer 150 x 40).
Overigens vind ik het trouwens niet verkeerd om arrays te gebruiken voor de opslag van statische gegevens die niet verder bewerkt hoeven worden. Als je bijvoorbeeld een bitmap uit een bestand leest en de kleurwaarden in een array opslaat, lijkt me dat prima: je hebt nooit de intentie om de grootte van die array te wijzigen. Wil je echter elementen aan de collectie kunnen toevoegen, of eruit verwijderen, dan is een gewone array doorgaans ook geschikt, zeker als je geen van de operaties op Collection classes nodig hebt (zoals het sorteren van elementen, etc.).
Afhankelijk van wat voor programma je gebruikt, zou ik zeggen dat je best als eis kunt stellen dat de array 'vierkant' moet zijn en meer dan 0 elementen moet bevatten. Dit moet je dan natuurlijk wel duidelijk documenteren. Je kunt (zeker in Java) nu eenmaal niet overal op gaan controleren, maar je kunt er wel goed voor zorgen dat je code consistent, helder en goed gedocumenteerd is. Op die manier kun je ook fouten uitsluiten.Naar mijn mening is die code best generiek. De arrays worden bij de start van mijn programma geinitialiseerd met de juiste breedtes die uit het invoerbestand wordt gehaald. Deze breedtes lees ik zelf ook in een variabelen in dus het is vrij makkelijk bij te houden wat de breedte van een bepaalde regel in mijn array is.
Ik vind de waarheid van die opmerking nogal afhankelijk van de functionaliteit die de code aanbiedt. Als de functie een matrix inverteert, dan is het de vraag of het zinvol is om ondersteuning te bieden voor een niet-vierkante array, want die representeert eigenlijk geen goede matrix (tenzij je zelf met nullen gaat aanvullen maar dat is zeker verkeerd; motivatie op aanvraag beschikbaar). Ik vind het dan best redelijk om te stellen dat de functie een vierkante array vereist.Glimi schreef op 07 July 2003 @ 10:51:
Kijk verder dan je eigen code. Als ik een programma heb waarin ik een niet-vierkante array heb en gebruik uw code, dan zal het dus niet werken
Uiteraard zou je de invoer kunnen controleren op geldigheid en een InvalidArgumentException kunnen gooien als je een verkeerde array binnenkrijgt, maar die controle is in veel situaties erg duur, en hoewel ik dat niet zo'n sterk argument voor het Java platform vindt (zie eerdere reacties
[ Voor 23% gewijzigd door Soultaker op 07-07-2003 11:13 ]
snap het niet hoor? wat had mijn comment nou met jouw code te maken?
mijn persoonlijke ervaringen met [] == speed. gecombineerd met System.arraycopy enzovoorts is dit veel (VEEL) sneller dan het werken met collection-classes (maar natuurlijk veel minder 'handig'). Dat een [] ook wordt gebounds checked: idd maar wel op native niveau niet in java p-code. En daar is wel een enorm verschil in. en een array[index] is ook heel wat sneller dan een
Collecten.get(item). (als het een linkedlist is - oh boy).
Maar goed dit is voor een situatie waar speed een must is (en met java being quite slow dit is wel overal
Ook hammerheads conclusie dat een Collection gevult moet worden met Objects is heel juist. Voor images is dit gewoon overkill.
Het echt enige jammer van Java + Imaging is het gebrek aan een 'unsigned'.
De grootte van de z-buffer staat vast zolang het scherm niet geresized wordt, maar wanneer het scherm geresized wordt, of wanneer ik het scherm op een andere grootte laat initialiseren, dan wil ik graag dat daar automatisch goed mee omgegaan wordt. Bij een scherm-resize resize ik namelijk ook de z-buffer. Daarbij is het niet nodig oude waarden in de z-buffer op te slaan, dus dat doe ik dan ook niet.
En de maten van de z-buffer meegeven vind ik niet echt netjes, want ik doe meerdere methode-aanroepen die hem nodig hebben en als ik die nu ook nog eens twee extre integers mee moet geven, dan zit ik naar mijn mening op onhandig veel parameters, zeker ook omdat de waarden die ik wil hebben al in de array zitten besloten.
De reden dat ik JAVA gebruik, is dat ik daar redelijk mijn weg in weet en dat ik het wel leuk vindt om mijn programmaatje in applet-vorm te maken, zodat ik het online neer kan zetten. Ik weet wel dat JAVA eigenlijk veel te traag is voor een 3d-engine, maar dit hele project is toch vooral bedoeld om ervaring op te doen met het schrijven van een 3d-renderer en mijn net opgedane kennis van lineaire algebra in de praktijk te brengen. Dat het niet een bruikbare snelheid haalt is dus niet echt erg.
Devblog / portfolio
Swords & Soldiers
Awesomenauts
Proun
Cello Fortress
er bestaan trouwens al heelder software java-3d engines en die zijn best wel snel (geel fulsscreen he - applet size) maar de meeste zullen wel geen z-buffer approach gebruiken maar span-based rendering. (de laatste heeft 0-overdraw (tenzij je transparency hebt)) terwijl een zbuffer niet zo cpu vriendelijk is.
doe een paar tests om te kijken of:
array[10][10] = 0xFFFFF; sneller is dan array[10*w+10]. als het om realtime gaak moet je dit testen. Ook zou je best kijken naar Volatile Image enzovoorts. Ook ByteBuffers (NIO) zullen extra tijdwinst opleveren (deze zijn native arrays). Beslis ook dat met 16bit kleuren of 24(32) wil werken.
Enjoy... (je ZOU ook JavaOGL kunnen installeren
Devblog / portfolio
Swords & Soldiers
Awesomenauts
Proun
Cello Fortress
Is het zo dat indien ik voor mijn programma gebruik maak van vaste grootte arrays van integers met vrij kleine waarden ik nog een snelheidswinst zou kunnen halen met het gebruik van ByteBuffers?hobbit_be schreef op 07 July 2003 @ 12:58:
...
Ook ByteBuffers (NIO) zullen extra tijdwinst opleveren (deze zijn native arrays).
...
Aviation is proof that given the will, we have the capacity to achieve the impossible.
--Eddie Rickenbacker
? integers met kleine waardes? <255 ofzo? ik denk niet dat het handig zou zijn om je int te gaan opsplitsen in 4 bytes en die dan samen te voegen (veel geshift en veel sign probs). IntBuffer ?hammerhead schreef op 07 July 2003 @ 13:18:
[...]
Is het zo dat indien ik voor mijn programma gebruik maak van vaste grootte arrays van integers met vrij kleine waarden ik nog een snelheidswinst zou kunnen halen met het gebruik van ByteBuffers?
Misschien niet, maar ik heb even zitten kijken bij de API's van NIO en ik kwam tegen dat indien er gebruik gemaakt wordt van ByteBuffers het mogelijk is om deze Direct te maken waardoor de JVM zal proberen alle operaties die je erop uitvoert native te doen. Het lijkt me dat dat op zich wel wat kan schelen, maar geheel zeker weten doe ik dat niet. Daarom vroeg ik me dat dus af. Indien niemand het antwoord zo snel weet zal ik mijn programma als ik tijd heb eens om gaan schrijven om het zelf te gaan testen.hobbit_be schreef op 07 July 2003 @ 13:33:
[...]
? integers met kleine waardes? <255 ofzo? ik denk niet dat het handig zou zijn om je int te gaan opsplitsen in 4 bytes en die dan samen te voegen (veel geshift en veel sign probs). IntBuffer ?
Aviation is proof that given the will, we have the capacity to achieve the impossible.
--Eddie Rickenbacker
hobbit_be schreef op 07 juli 2003 @ 12:35:
snap het niet hoor? wat had mijn comment nou met jouw code te maken?
Je word of warning
Mja ik ben toch eerder geneigd om te gaan voor het tegengaan van data-corruptie door een verkeerde invoer. Maarja daarom zou ik ook eigenlijk niet voor array's kiezen en en voor een class zoals je ook suggereertSoultaker
(...)Ik vind het dan best redelijk om te stellen dat de functie een vierkante array vereist.
Uiteraard zou je de invoer kunnen controleren op geldigheid en een InvalidArgumentException kunnen gooien als je een verkeerde array binnenkrijgt,