Tôi hoàn toàn hiểu rằng điều này không trả lời câu hỏi, chỉ muốn đề cập đến rằng jdk-9 giới thiệu thêm một tối ưu hóa mà là theo mặc định được gọi là:
-XX: + CompactStrings
trong đó Latin1 ký tự chiếm một byte đơn thay vì hai (thông qua một char). Vì sự thay đổi đó, nhiều phương thức nội bộ của String đã thay đổi - chúng hoạt động tương tự với người dùng, nhưng nội bộ chúng lại nhanh hơn trong nhiều trường hợp.
Cũng trong trường hợp các chuỗi để ghép hai chuỗi lại với nhau thông qua dấu cộng, javac sẽ tạo ra bytecode khác nhau.
Không có hướng dẫn bytecode mà nối hai Strings với nhau để javac sẽ tạo ra một
StringBuilder # thêm
trong back-end. Cho đến jdk-9.
Bây giờ các đại biểu bytecode để
StringConcatFactory # makeConcatWithConstants
hoặc
StringConcatFactory # makeConcat
qua hướng dẫn bytecode invokedynamic:
aload_0
1: aload_2
2: aload_1
3: invokedynamiC#8, 0 // InvokeDynamiC#0:makeConcatWithConstants:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
8: areturn
Cách hai chuỗi được nối là một quyết định Thời gian chạy ngay bây giờ. nó có thể vẫn là một StringBuilder hoặc nó có thể là một nối của mảng byte, vv Tất cả bạn biết rằng điều này có thể thay đổi và bạn sẽ nhận được giải pháp nhanh nhất có thể.
EDIT
Tôi vừa mới sửa lỗi và thấy rằng có khá nhiều chiến lược về cách nối thêm những Strings:
private enum Strategy {
/**
* Bytecode generator, calling into {@link java.lang.StringBuilder}.
*/
BC_SB,
/**
* Bytecode generator, calling into {@link java.lang.StringBuilder};
* but trying to estimate the required storage.
*/
BC_SB_SIZED,
/**
* Bytecode generator, calling into {@link java.lang.StringBuilder};
* but computing the required storage exactly.
*/
BC_SB_SIZED_EXACT,
/**
* MethodHandle-based generator, that in the end calls into {@link java.lang.StringBuilder}.
* This strategy also tries to estimate the required storage.
*/
MH_SB_SIZED,
/**
* MethodHandle-based generator, that in the end calls into {@link java.lang.StringBuilder}.
* This strategy also estimate the required storage exactly.
*/
MH_SB_SIZED_EXACT,
/**
* MethodHandle-based generator, that constructs its own byte[] array from
* the arguments. It computes the required storage exactly.
*/
MH_INLINE_SIZED_EXACT
}
mặc định là:
MH_INLINE_SIZED_EXACT
Tôi nghĩ nó (như bạn đoán) * chủ yếu * chi phí thời gian chạy của de-duplication. –
Không phải G1GC, nhưng bản sao trùng lặp có thể được coi là mới. – Holger