diff --git a/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/Encoder.kt b/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/Encoder.kt index bcae856..16dd0cb 100644 --- a/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/Encoder.kt +++ b/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/Encoder.kt @@ -24,6 +24,8 @@ fun interface Encoder { companion object { + var globalUseJavaString: Boolean = false + /** * Returns an [Encoder] that encodes by simply returning the input value. */ @@ -31,7 +33,7 @@ fun interface Encoder { fun encoderFor(type: KType): Encoder<*> { val encoder: Encoder<*> = when (val classifier = type.classifier) { - String::class -> StringEncoder + String::class -> if (globalUseJavaString) JavaStringEncoder else StringEncoder Boolean::class -> BooleanEncoder Float::class -> FloatEncoder Double::class -> DoubleEncoder diff --git a/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/strings.kt b/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/strings.kt index cde4142..3f7a4b1 100644 --- a/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/strings.kt +++ b/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/strings.kt @@ -21,6 +21,14 @@ object StringEncoder : Encoder { } } +/** + * An [Encoder] for strings which always uses the JVM String object regardless + * of any [GenericData.STRING_PROP] settings on the schema. + */ +object JavaStringEncoder : Encoder { + override fun encode(schema: Schema, value: String) = value +} + object UUIDEncoder : Encoder { override fun encode(schema: Schema, value: UUID): Any { return Utf8(value.toString()) diff --git a/centurion-avro/src/test/kotlin/com/sksamuel/centurion/avro/encoders/Benchmarks.kt b/centurion-avro/src/test/kotlin/com/sksamuel/centurion/avro/encoders/Benchmarks.kt index 7ac2ec3..9f2e577 100644 --- a/centurion-avro/src/test/kotlin/com/sksamuel/centurion/avro/encoders/Benchmarks.kt +++ b/centurion-avro/src/test/kotlin/com/sksamuel/centurion/avro/encoders/Benchmarks.kt @@ -26,26 +26,37 @@ fun main() { GenericData.setStringType(schema, GenericData.StringType.String) -// repeat(5) { -// val time = measureTime { -// repeat(5_000_000) { -// ReflectionRecordEncoder().encode(schema, user) -// } -// } -// println("ReflectionRecordEncoder: $time") -// } + repeat(2) { + val time = measureTime { + repeat(2_000_000) { + ReflectionRecordEncoder().encode(schema, user) + } + } + println("ReflectionRecordEncoder: $time") + } + + repeat(10) { + val encoder = SpecificRecordEncoder(User::class, schema) + val time = measureTime { + repeat(2_000_000) { + encoder.encode(schema, user) + } + } + println("SpecificRecordEncoder globalUseJavaString=false: $time") + } - repeat(5) { + repeat(10) { + Encoder.globalUseJavaString = true val encoder = SpecificRecordEncoder(User::class, schema) val time = measureTime { - repeat(5_000_000) { + repeat(2_000_000) { encoder.encode(schema, user) } } - println("SpecificRecordEncoder: $time") + println("SpecificRecordEncoder globalUseJavaString=true: $time") } - repeat(5) { + repeat(10) { val encoder = Encoder { schema, value -> val record = GenericData.Record(schema) @@ -58,7 +69,7 @@ fun main() { } val time = measureTime { - repeat(5_000_000) { + repeat(2_000_000) { encoder.encode(schema, user) } }