From f4a1aa640eed4b00bbc25f63edffc4acbf956638 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 15 Aug 2016 11:44:36 +0300 Subject: [PATCH] Optimize KClass creation from Class instance Don't create unnecessary iterator every time in HashPMap.get (see https://github.com/hrldcpr/pcollections/pull/41). Also fix a warning and remove misleading comment --- .../src/kotlin/reflect/jvm/internal/kClassCache.kt | 3 +-- .../reflect/jvm/internal/pcollections/ConsPStack.java | 4 ++-- .../reflect/jvm/internal/pcollections/HashPMap.java | 11 ++++++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/kClassCache.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/kClassCache.kt index 12e7aacba9b..93422cc0f0c 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/kClassCache.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/kClassCache.kt @@ -34,7 +34,7 @@ internal fun getOrCreateKotlinClass(jClass: Class): KClassImpl { @Suppress("UNCHECKED_CAST") val kClass = cached.get() as KClassImpl? if (kClass?.jClass == jClass) { - return kClass!! + return kClass } } else if (cached != null) { @@ -51,7 +51,6 @@ internal fun getOrCreateKotlinClass(jClass: Class): KClassImpl { // This is the most unlikely case: we found a cached array of references of length at least 2 (can't be 1 because // the single element would be cached instead), and none of those classes is the one we're looking for val size = cached.size - // Don't use Array constructor because it creates a lambda val newArray = arrayOfNulls>>(size + 1) // Don't use Arrays.copyOf because it works reflectively System.arraycopy(cached, 0, newArray, 0, size) diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/pcollections/ConsPStack.java b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/pcollections/ConsPStack.java index 47a8452c696..5d9f5883c18 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/pcollections/ConsPStack.java +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/pcollections/ConsPStack.java @@ -32,8 +32,8 @@ final class ConsPStack implements Iterable { return (ConsPStack) EMPTY; } - private final E first; - private final ConsPStack rest; + final E first; + final ConsPStack rest; private final int size; private ConsPStack() { // EMPTY constructor diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/pcollections/HashPMap.java b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/pcollections/HashPMap.java index db2b8a247a4..c54d8f9213f 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/pcollections/HashPMap.java +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/pcollections/HashPMap.java @@ -28,7 +28,7 @@ public final class HashPMap { @SuppressWarnings("unchecked") @NotNull public static HashPMap empty() { - return (HashPMap) HashPMap.EMPTY; + return (HashPMap) EMPTY; } private final IntTreePMap>> intMap; @@ -49,9 +49,12 @@ public final class HashPMap { public V get(Object key) { ConsPStack> entries = getEntries(key.hashCode()); - for (MapEntry entry : entries) + while (entries != null && entries.size() > 0) { + MapEntry entry = entries.first; if (entry.key.equals(key)) return entry.value; + entries = entries.rest; + } return null; } @@ -86,9 +89,11 @@ public final class HashPMap { private static int keyIndexIn(ConsPStack> entries, Object key) { int i = 0; - for (MapEntry entry : entries) { + while (entries != null && entries.size() > 0) { + MapEntry entry = entries.first; if (entry.key.equals(key)) return i; + entries = entries.rest; i++; } return -1;