From: <jde...@us...> - 2012-09-28 21:55:22
|
Revision: 17504 http://pcgen.svn.sourceforge.net/pcgen/?rev=17504&view=rev Author: jdempsey Date: 2012-09-28 21:55:16 +0000 (Fri, 28 Sep 2012) Log Message: ----------- Fix bug: Big performance drop in 5.17.18 when loading characters Issue#: CODE-1683 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java Modified: Trunk/pcgen/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java 2012-09-28 20:18:24 UTC (rev 17503) +++ Trunk/pcgen/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java 2012-09-28 21:55:16 UTC (rev 17504) @@ -262,6 +262,9 @@ private TodoManager todoManager; private boolean allowDebt; + private int lastExportCharSerial = 0; + private PlayerCharacter lastExportChar = null; + /** * Create a new character facade for an existing character. * @@ -2558,6 +2561,27 @@ theCharacter.setFileName(file.getName()); } + + /** + * Retrieve a copy of the current character suitable for export. This + * attempts to minimise the expensive cloning function, by returning the + * previously cloned character if the base character has not changed in + * the meantime. + * @return A copy of the current character. + */ + private synchronized PlayerCharacter getExportCharacter() + { + PlayerCharacter exportPc = lastExportChar; + if (exportPc == null + || theCharacter.getSerial() != lastExportCharSerial) + { + exportPc = (PlayerCharacter) theCharacter.clone(); + lastExportChar = exportPc; + lastExportCharSerial = theCharacter.getSerial(); + } + return exportPc; + } + /* (non-Javadoc) * @see pcgen.core.facade.CharacterFacade#export(pcgen.io.ExportHandler, java.io.BufferedWriter) */ @@ -2569,8 +2593,10 @@ { try { - PlayerCharacter exportPc = (PlayerCharacter) theCharacter.clone(); + Logging.log(Logging.INFO, "Starting export at serial " + theCharacter.getSerial() + " to " + theHandler.getTemplateFile()); + PlayerCharacter exportPc = getExportCharacter(); theHandler.write(exportPc, buf); + Logging.log(Logging.INFO, "Finished export at serial " + theCharacter.getSerial() + " to " + theHandler.getTemplateFile()); return; } catch (ConcurrentModificationException e) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |