From 9d4970099e1c2e6be81ee88829d2d9874e168fed Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Sun, 3 Jun 2012 17:18:59 +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) Conflicts: jOOQ/src/main/java/org/jooq/conf/SettingsTools.java --- .../java/org/jooq/conf/SettingsTools.java | 40 ++++++++++++++++--- 1 file changed, 35 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 7da17b7af59..086b5e1188b 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; @@ -144,8 +146,36 @@ public static final RenderMapping getRenderMapping(Settings settings) { public static final Settings defaultSettings() { // Clone the DEFAULT_SETTINGS to prevent modification - StringWriter xml = new StringWriter(); - JAXB.marshal(DEFAULT_SETTINGS, xml); - return JAXB.unmarshal(new StringReader(xml.toString()), Settings.class); + return clone(DEFAULT_SETTINGS); + } + + /** + * Clone some settings + */ + private static final Settings clone(Settings settings) { + // [#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! } }