2424import java .util .List ;
2525import java .util .Stack ;
2626
27+ import static java .lang .Math .max ;
2728import static java .lang .String .format ;
2829import static org .bson .assertions .Assertions .notNull ;
2930
@@ -37,13 +38,34 @@ public class BsonBinaryWriter extends AbstractBsonWriter {
3738
3839 private final BsonOutput bsonOutput ;
3940 private final Stack <Integer > maxDocumentSizeStack = new Stack <>();
40- private static final int ARRAY_INDEXES_CACHE_SIZE = 256 ;
41- private static final String [] ARRAY_INDEXES_CACHE = new String [ARRAY_INDEXES_CACHE_SIZE ];
41+ private static final int ARRAY_INDEXES_CACHE_SIZE = 1000 ;
42+ private static final byte [] ARRAY_INDEXES_BUFFER ;
43+ private static final int [] ARRAY_INDEXES_OFFSETS ;
44+ private static final int [] ARRAY_INDEXES_LENGTHS ;
4245 private Mark mark ;
4346
4447 static {
48+ ARRAY_INDEXES_LENGTHS = new int [ARRAY_INDEXES_CACHE_SIZE ];
49+ ARRAY_INDEXES_OFFSETS = new int [ARRAY_INDEXES_CACHE_SIZE ];
50+ int totalSize = 0 ;
4551 for (int i = 0 ; i < ARRAY_INDEXES_CACHE_SIZE ; i ++) {
46- ARRAY_INDEXES_CACHE [i ] = Integer .toString (i );
52+ totalSize += (int ) (Math .log10 (max (i , 1 ))
53+ + 1 // number of digits
54+ + 1 ); // +1 for null terminator
55+ }
56+ ARRAY_INDEXES_BUFFER = new byte [totalSize ];
57+
58+ // Fill buffer
59+ int offset = 0 ;
60+ for (int i = 0 ; i < ARRAY_INDEXES_CACHE_SIZE ; i ++) {
61+ String string = Integer .toString (i );
62+ int length = string .length ();
63+ for (int j = 0 ; j < length ; j ++) {
64+ ARRAY_INDEXES_BUFFER [offset ++] = (byte ) string .charAt (j );
65+ }
66+ ARRAY_INDEXES_BUFFER [offset ++] = 0 ;
67+ ARRAY_INDEXES_OFFSETS [i ] = offset - (length + 1 );
68+ ARRAY_INDEXES_LENGTHS [i ] = length + 1 ; // +1 for null terminator
4769 }
4870 }
4971
@@ -409,7 +431,9 @@ private void writeCurrentName() {
409431 if (index >= ARRAY_INDEXES_CACHE_SIZE ) {
410432 bsonOutput .writeCString (Integer .toString (index ));
411433 } else {
412- bsonOutput .writeCString (ARRAY_INDEXES_CACHE [index ]);
434+ bsonOutput .writeBytes (ARRAY_INDEXES_BUFFER ,
435+ ARRAY_INDEXES_OFFSETS [index ],
436+ ARRAY_INDEXES_LENGTHS [index ]);
413437 }
414438 } else {
415439 bsonOutput .writeCString (getName ());
0 commit comments