24
24
import java .util .List ;
25
25
import java .util .Stack ;
26
26
27
+ import static java .lang .Math .max ;
27
28
import static java .lang .String .format ;
28
29
import static org .bson .assertions .Assertions .notNull ;
29
30
@@ -37,13 +38,34 @@ public class BsonBinaryWriter extends AbstractBsonWriter {
37
38
38
39
private final BsonOutput bsonOutput ;
39
40
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 ;
42
45
private Mark mark ;
43
46
44
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 ;
45
51
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
47
69
}
48
70
}
49
71
@@ -409,7 +431,9 @@ private void writeCurrentName() {
409
431
if (index >= ARRAY_INDEXES_CACHE_SIZE ) {
410
432
bsonOutput .writeCString (Integer .toString (index ));
411
433
} else {
412
- bsonOutput .writeCString (ARRAY_INDEXES_CACHE [index ]);
434
+ bsonOutput .writeBytes (ARRAY_INDEXES_BUFFER ,
435
+ ARRAY_INDEXES_OFFSETS [index ],
436
+ ARRAY_INDEXES_LENGTHS [index ]);
413
437
}
414
438
} else {
415
439
bsonOutput .writeCString (getName ());
0 commit comments