Подправим производительность

This commit is contained in:
DBotThePony 2022-12-31 13:57:15 +07:00
parent f751c126f6
commit c7952ba53d
Signed by: DBot
GPG Key ID: DCC23B5715498507
3 changed files with 26 additions and 19 deletions

View File

@ -8,24 +8,24 @@ import com.google.gson.JsonPrimitive
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap
private fun flattenJsonPrimitive(input: JsonPrimitive): Any {
private fun flattenJsonPrimitive(input: JsonPrimitive, interner: (String) -> String = String::intern): Any {
if (input.isNumber) {
return input.asNumber
} else if (input.isString) {
return input.asString.intern()
return interner(input.asString)
} else {
return input.asBoolean
}
}
private fun flattenJsonArray(input: JsonArray): ArrayList<Any> {
private fun flattenJsonArray(input: JsonArray, interner: (String) -> String = String::intern): ArrayList<Any> {
val flattened = ArrayList<Any>(input.size())
for (v in input) {
when (v) {
is JsonObject -> flattened.add(flattenJsonObject(v))
is JsonArray -> flattened.add(flattenJsonArray(v))
is JsonPrimitive -> flattened.add(flattenJsonPrimitive(v))
is JsonObject -> flattened.add(flattenJsonObject(v, interner))
is JsonArray -> flattened.add(flattenJsonArray(v, interner))
is JsonPrimitive -> flattened.add(flattenJsonPrimitive(v, interner))
// is JsonNull -> baked.add(null)
}
}
@ -33,30 +33,30 @@ private fun flattenJsonArray(input: JsonArray): ArrayList<Any> {
return flattened
}
private fun flattenJsonObject(input: JsonObject): MutableMap<String, Any> {
private fun flattenJsonObject(input: JsonObject, interner: (String) -> String = String::intern): MutableMap<String, Any> {
val flattened = Object2ObjectOpenHashMap<String, Any>()
for ((k, v) in input.entrySet()) {
when (v) {
is JsonObject -> flattened[k] = flattenJsonObject(v)
is JsonArray -> flattened[k] = flattenJsonArray(v)
is JsonPrimitive -> flattened[k] = flattenJsonPrimitive(v)
is JsonObject -> flattened[k] = flattenJsonObject(v, interner)
is JsonArray -> flattened[k] = flattenJsonArray(v, interner)
is JsonPrimitive -> flattened[k] = flattenJsonPrimitive(v, interner)
}
}
return flattened
}
fun flattenJsonElement(input: JsonElement): Any? {
fun flattenJsonElement(input: JsonElement, interner: (String) -> String = String::intern): Any? {
return when (input) {
is JsonObject -> flattenJsonObject(input)
is JsonArray -> flattenJsonArray(input)
is JsonPrimitive -> flattenJsonPrimitive(input)
is JsonObject -> flattenJsonObject(input, interner)
is JsonArray -> flattenJsonArray(input, interner)
is JsonPrimitive -> flattenJsonPrimitive(input, interner)
is JsonNull -> null
else -> throw IllegalArgumentException("Unknown argument $input")
}
}
fun flattenJsonElement(input: JsonObject) = flattenJsonObject(input)
fun flattenJsonElement(input: JsonArray) = flattenJsonArray(input)
fun flattenJsonElement(input: JsonPrimitive) = flattenJsonPrimitive(input)
fun flattenJsonElement(input: JsonObject, interner: (String) -> String = String::intern) = flattenJsonObject(input, interner)
fun flattenJsonElement(input: JsonArray, interner: (String) -> String = String::intern) = flattenJsonArray(input, interner)
fun flattenJsonElement(input: JsonPrimitive, interner: (String) -> String = String::intern) = flattenJsonPrimitive(input, interner)

View File

@ -2,6 +2,7 @@ package ru.dbotthepony.kstarbound.defs
import com.google.common.collect.ImmutableMap
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap
import ru.dbotthepony.kstarbound.Starbound
import ru.dbotthepony.kstarbound.io.json.INativeJsonHolder
/**
@ -15,7 +16,7 @@ import ru.dbotthepony.kstarbound.io.json.INativeJsonHolder
*/
abstract class RawPrototype<RAW : RawPrototype<RAW, ASSEMBLED>, ASSEMBLED : AssembledPrototype<ASSEMBLED, RAW>> : INativeJsonHolder {
val json = Object2ObjectArrayMap<String, Any>()
fun enroll() = enrollMap(json)
fun enroll() = enrollMap(json, Starbound.assetStringInterner::intern)
abstract fun assemble(directory: String = ""): ASSEMBLED
override fun acceptJson(json: MutableMap<String, Any>) {

View File

@ -13,6 +13,7 @@ import com.google.gson.stream.JsonWriter
import it.unimi.dsi.fastutil.objects.ObjectArraySet
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet
import org.apache.logging.log4j.LogManager
import ru.dbotthepony.kstarbound.Starbound
import ru.dbotthepony.kstarbound.defs.flattenJsonElement
import ru.dbotthepony.kstarbound.util.NotNullVar
import kotlin.reflect.KClass
@ -95,7 +96,12 @@ class BuilderAdapter<T : Any> private constructor(
if (instance is IJsonHolder) {
val obj = TypeAdapters.JSON_ELEMENT.read(reader)
reader = JsonTreeReader(obj)
instance.acceptJson(obj.asJsonObject)
if (instance is INativeJsonHolder) {
instance.acceptJson(flattenJsonElement(obj.asJsonObject, Starbound.assetStringInterner::intern))
} else {
instance.acceptJson(obj.asJsonObject)
}
}
reader.beginObject()