While working on a game project for Android i was digging for some information on performance optimization for game code. And i came to know that use of Java Collections like List,Arraylist etc are not encouraged in game codes,though collection is an useful tool in Java programming.Why is it so? I would like to know technical details as how much impact can Collection framework have on Android systems and why? Any help in this regard will be great.
-
\$\begingroup\$ Where did you read that? \$\endgroup\$egarcia– egarcia2010-11-12 13:08:58 +00:00Commented Nov 12, 2010 at 13:08
-
\$\begingroup\$ probably here: developer.android.com/guide/practices/design/performance.html Note how it says: To summarize: use the enhanced for loop by default, but consider a hand-written counted loop for performance-critical ArrayList iteration. \$\endgroup\$Nailer– Nailer2010-11-12 13:41:13 +00:00Commented Nov 12, 2010 at 13:41
1 Answer
It's mostly about memory allocation and garbage collection. Memory allocations during runtime gives your garbage collector a chance to bring out the trash. Which hurts your performance. GC should happen as seldom as possible.
Most java collections:
A) Allocate more memory than they need.
B) Allocate memory when you don't want them to.
C) Allocate memory for each iterator when iterating through a collection.
To circumvent these things:
A) Allocate collections with fixed sizes. ie. create object pools.
B) Allocate these pools at program init.
C) Avoid the for( Object obj : collection ) for those collection types that has a size() and a .get(int index) method.
-
2\$\begingroup\$ All valid points, but keep in mind: "We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil". You should limit such optimizations to the spots where they are really necessary. In all other places, strife for a clear and simple design. \$\endgroup\$Michael Klement– Michael Klement2010-11-12 12:48:08 +00:00Commented Nov 12, 2010 at 12:48
-
\$\begingroup\$ @Michael: On today's systems, with fast caches and slow memory and multiple cores, memory allocations are about the most expensive thing you can do. \$\endgroup\$user744– user7442010-11-12 13:24:39 +00:00Commented Nov 12, 2010 at 13:24
-
2\$\begingroup\$ @Michael: You'd be hard pressed to find any high performance commercial game engine not doing as much as they possibly can to optimize their memory allocation patterns. Here's a long talk about the subject of realtime android games. It's a bit old, but most of it should still apply: youtube.com/watch?v=U4Bk5rmIpic \$\endgroup\$Nailer– Nailer2010-11-12 13:39:43 +00:00Commented Nov 12, 2010 at 13:39
-
\$\begingroup\$ Sure, don't get me wrong: I didn't want to disagree with your answer. I just wanted to point out that you should optimize judiciously and at the right spots. There is no benefit in using Arrays over Collections at a spot that has a minimal impact on performance (say 1%). (Also discussed more elaborately here: developer.android.com/guide/practices/design/… ) \$\endgroup\$Michael Klement– Michael Klement2010-11-12 14:18:11 +00:00Commented Nov 12, 2010 at 14:18
-
3\$\begingroup\$ @AttackingHobo: I disagree. Optimizing blindly is not benficial, which is what your statement sounds like to me (correct me if I got it wrong). Chris Pruett also stated in the Google IO Video linked above: "Choose flexbility over speed every day of the week...until the gameplay is damaged." and I agree with this. \$\endgroup\$Michael Klement– Michael Klement2010-11-12 15:48:57 +00:00Commented Nov 12, 2010 at 15:48