From 828227f59de3c5f442631d03158f3feddb8da64f Mon Sep 17 00:00:00 2001 From: Arndt Brenschede Date: Sat, 29 Jun 2019 10:11:59 +0200 Subject: [PATCH] decoding performance --- .../main/java/btools/codec/MicroCache2.java | 2 +- .../java/btools/codec/StatCoderContext.java | 16 +++---- .../btools/codec/StatCoderContextTest.java | 6 +-- .../java/btools/mapaccess/DirectWeaver.java | 45 ++++++++++--------- .../main/java/btools/mapaccess/OsmNode.java | 9 +--- .../java/btools/util/BitCoderContext.java | 33 ++++++++++++-- 6 files changed, 65 insertions(+), 46 deletions(-) diff --git a/brouter-codec/src/main/java/btools/codec/MicroCache2.java b/brouter-codec/src/main/java/btools/codec/MicroCache2.java index ca3c1b3..7829384 100644 --- a/brouter-codec/src/main/java/btools/codec/MicroCache2.java +++ b/brouter-codec/src/main/java/btools/codec/MicroCache2.java @@ -62,7 +62,7 @@ public final class MicroCache2 extends MicroCache if ( debug ) System.out.println( "*** decoding cache of size=" + size + " for lonIdx=" + lonIdx + " latIdx=" + latIdx ); - bc.decodeSortedArray( faid, 0, size, 0x20000000, 0 ); + bc.decodeSortedArray( faid, 0, size, 29, 0 ); for( int n = 0; n= 0 ) { - if ( decodeBit() ) - { - value |= nextbit; - } - nextbit >>= 1; + value |= decodeBitsReverse( nextbitpos+1 ); } values[offset] = value; return; } - if ( nextbit == 0 ) + if ( nextbitpos < 0 ) { while (subsize-- > 0) { @@ -298,11 +294,11 @@ public final class StatCoderContext extends BitCoderContext if ( size1 > 0 ) { - decodeSortedArray( values, offset, size1, nextbit >> 1, value ); + decodeSortedArray( values, offset, size1, nextbitpos-1, value ); } if ( size2 > 0 ) { - decodeSortedArray( values, offset + size1, size2, nextbit >> 1, value | nextbit ); + decodeSortedArray( values, offset + size1, size2, nextbitpos-1, value | (1 << nextbitpos) ); } } diff --git a/brouter-codec/src/test/java/btools/codec/StatCoderContextTest.java b/brouter-codec/src/test/java/btools/codec/StatCoderContextTest.java index 2ee1af6..616e421 100644 --- a/brouter-codec/src/test/java/btools/codec/StatCoderContextTest.java +++ b/brouter-codec/src/test/java/btools/codec/StatCoderContextTest.java @@ -13,7 +13,7 @@ public class StatCoderContextTest { byte[] ab = new byte[40000]; StatCoderContext ctx = new StatCoderContext( ab ); - for ( int noisybits = 0; noisybits < 12; noisybits++ ) + for ( int noisybits = 1; noisybits < 12; noisybits++ ) { for ( int i = 0; i < 1000; i++ ) { @@ -22,7 +22,7 @@ public class StatCoderContextTest } ctx = new StatCoderContext( ab ); - for ( int noisybits = 0; noisybits < 12; noisybits++ ) + for ( int noisybits = 1; noisybits < 12; noisybits++ ) { for ( int i = 0; i < 1000; i++ ) { @@ -114,7 +114,7 @@ public class StatCoderContextTest ctx = new StatCoderContext( ab ); int[] decodedValues = new int[size]; - ctx.decodeSortedArray( decodedValues, 0, size, 0x08000000, 0 ); + ctx.decodeSortedArray( decodedValues, 0, size, 27, 0 ); for ( int i = 0; i < size; i++ ) { diff --git a/brouter-mapaccess/src/main/java/btools/mapaccess/DirectWeaver.java b/brouter-mapaccess/src/main/java/btools/mapaccess/DirectWeaver.java index aa25238..7331af3 100644 --- a/brouter-mapaccess/src/main/java/btools/mapaccess/DirectWeaver.java +++ b/brouter-mapaccess/src/main/java/btools/mapaccess/DirectWeaver.java @@ -16,20 +16,15 @@ import btools.util.IByteArrayUnifier; */ public final class DirectWeaver extends ByteDataWriter { - private int lonBase; - private int latBase; - private int cellsize; + private long id64Base; private int size = 0; - private static boolean debug = false; - public DirectWeaver( DataBuffers dataBuffers, int lonIdx, int latIdx, int divisor, TagValueValidator wayValidator, WaypointMatcher waypointMatcher, OsmNodesMap hollowNodes ) throws Exception { super( null ); - cellsize = 1000000 / divisor; - lonBase = lonIdx*cellsize; - latBase = latIdx*cellsize; + int cellsize = 1000000 / divisor; + id64Base = ((long)(lonIdx*cellsize))<<32 | (latIdx*cellsize); StatCoderContext bc = new StatCoderContext( dataBuffers.iobuffer ); @@ -45,9 +40,7 @@ public final class DirectWeaver extends ByteDataWriter int[] faid = size > dataBuffers.ibuf2.length ? new int[size] : dataBuffers.ibuf2; - if ( debug ) System.out.println( "*** decoding cache of size=" + size + " for lonIdx=" + lonIdx + " latIdx=" + latIdx ); - - bc.decodeSortedArray( faid, 0, size, 0x20000000, 0 ); + bc.decodeSortedArray( faid, 0, size, 29, 0 ); OsmNode[] nodes = new OsmNode[size]; for( int n = 0; n