From 93c2fd19895eafde59d16fb95c11b268d05b11b4 Mon Sep 17 00:00:00 2001 From: tiatin Date: Sat, 25 Jun 2016 14:36:18 +0300 Subject: [PATCH] Changed iteration over List from for-each to manual iteration. For-Each loop creates Iterator object and uses hasNext and next methods, which are slower, than manual iteration. Also allocating Iterator object increases work for GC. Forum post: https://hub.jmonkeyengine.org/t/iteration-over-list-performance-improvement/36250 See test 9 for more details: http://www.devahead.com/blog/2011/12/coding-for-performance-and-avoiding-garbage-collection-in-android/ --- jme3-core/src/main/java/com/jme3/material/Material.java | 7 ++++++- jme3-core/src/main/java/com/jme3/material/Technique.java | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/material/Material.java b/jme3-core/src/main/java/com/jme3/material/Material.java index d66f88a0b..b66027e48 100644 --- a/jme3-core/src/main/java/com/jme3/material/Material.java +++ b/jme3-core/src/main/java/com/jme3/material/Material.java @@ -750,7 +750,12 @@ public class Material implements CloneableSmartAsset, Cloneable, Savable { } private int applyOverrides(Renderer renderer, Shader shader, List overrides, int unit) { - for (MatParamOverride override : overrides) { + MatParamOverride override; + + // manual iteration is used to avoid iterator allocation and to increase iteration performance + for (int i = 0, listSize = overrides.size(); i < listSize; i++) { + override = overrides.get(i); + VarType type = override.getVarType(); MatParam paramDef = def.getMaterialParam(override.getName()); diff --git a/jme3-core/src/main/java/com/jme3/material/Technique.java b/jme3-core/src/main/java/com/jme3/material/Technique.java index 8ca95b178..0fb7df93d 100644 --- a/jme3-core/src/main/java/com/jme3/material/Technique.java +++ b/jme3-core/src/main/java/com/jme3/material/Technique.java @@ -111,7 +111,12 @@ public final class Technique { } private void applyOverrides(DefineList defineList, List overrides) { - for (MatParamOverride override : overrides) { + MatParamOverride override; + + // manual iteration is used to avoid iterator allocation and to increase iteration performance + for (int i = 0, listSize = overrides.size(); i < listSize; i++) { + override = overrides.get(i); + if (!override.isEnabled()) { continue; }