From d7191bda7af53654b474bfd273d15f5cf0d6b904 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Sun, 3 Jun 2012 15:47:08 +0200 Subject: [PATCH] [#1483] Inefficient cloning of default settings using JAXB unmarshalling leads to non-negligible overall overhead. Use serialisation instead (short of a useful XJC clone plugin) --- .../java/org/jooq/conf/SettingsTools.java | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/conf/SettingsTools.java b/jOOQ/src/main/java/org/jooq/conf/SettingsTools.java index b3852357da5..9008da826c8 100644 --- a/jOOQ/src/main/java/org/jooq/conf/SettingsTools.java +++ b/jOOQ/src/main/java/org/jooq/conf/SettingsTools.java @@ -38,10 +38,12 @@ import static org.jooq.conf.StatementType.PREPARED_STATEMENT; import static org.jooq.conf.StatementType.STATIC_STATEMENT; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.InputStream; -import java.io.StringReader; -import java.io.StringWriter; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.sql.PreparedStatement; import java.sql.Statement; @@ -151,8 +153,29 @@ public static final Settings defaultSettings() { * Clone some settings */ public static final Settings clone(Settings settings) { - StringWriter xml = new StringWriter(); - JAXB.marshal(settings, xml); - return JAXB.unmarshal(new StringReader(xml.toString()), Settings.class); + // [#1483] Benchmarks showed that this is 10x faster + // return (Settings) settings.clone(); + + // ... than this, which is in turn 5x faster + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ObjectOutputStream o = new ObjectOutputStream(out); + o.writeObject(settings); + o.flush(); + + ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); + ObjectInputStream i = new ObjectInputStream(in); + return (Settings) i.readObject(); + } + catch (Exception ignore) { + throw new RuntimeException(ignore); + } + + // ... than this: + // StringWriter xml = new StringWriter(); + // JAXB.marshal(settings, xml); + // return JAXB.unmarshal(new StringReader(xml.toString()), Settings.class); + + // TODO [#1483] [#1484] Let Settings implement Cloneable for even more speed! } }