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,8 +38,37 @@ public class BsonBinaryWriter extends AbstractBsonWriter {
3738
3839 private final BsonOutput bsonOutput ;
3940 private final Stack <Integer > maxDocumentSizeStack = new Stack <>();
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 ;
4045 private Mark mark ;
4146
47+ 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 ;
51+ for (int i = 0 ; i < ARRAY_INDEXES_CACHE_SIZE ; 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
69+ }
70+ }
71+
4272 /**
4373 * Construct an instance.
4474 *
@@ -259,7 +289,7 @@ public void doWriteNull() {
259289 public void doWriteObjectId (final ObjectId value ) {
260290 bsonOutput .writeByte (BsonType .OBJECT_ID .getValue ());
261291 writeCurrentName ();
262- bsonOutput .writeBytes (value . toByteArray () );
292+ bsonOutput .writeObjectId (value );
263293 }
264294
265295 @ Override
@@ -397,7 +427,14 @@ public void reset() {
397427
398428 private void writeCurrentName () {
399429 if (getContext ().getContextType () == BsonContextType .ARRAY ) {
400- bsonOutput .writeCString (Integer .toString (getContext ().index ++));
430+ int index = getContext ().index ++;
431+ if (index >= ARRAY_INDEXES_CACHE_SIZE ) {
432+ bsonOutput .writeCString (Integer .toString (index ));
433+ } else {
434+ bsonOutput .writeBytes (ARRAY_INDEXES_BUFFER ,
435+ ARRAY_INDEXES_OFFSETS [index ],
436+ ARRAY_INDEXES_LENGTHS [index ]);
437+ }
401438 } else {
402439 bsonOutput .writeCString (getName ());
403440 }
0 commit comments