Sử dụng khóa khi bạn không cần làm chậm ứng dụng của mình. Nó có thể là quá nhỏ để đo lường hoặc nó có thể cao đáng ngạc nhiên.
IMHO Thường thì cách tiếp cận tốt nhất là sử dụng mã khóa miễn phí trong một chương trình luồng đơn để làm cho nó rõ ràng mã này không có ý định chia sẻ qua chuỗi. Điều này có thể quan trọng hơn để bảo trì hơn bất kỳ vấn đề hiệu suất nào.
public static void main(String... args) throws IOException {
for (int i = 0; i < 3; i++) {
perfTest(new Vector<Integer>());
perfTest(new ArrayList<Integer>());
}
}
private static void perfTest(List<Integer> objects) {
long start = System.nanoTime();
final int runs = 100000000;
for (int i = 0; i < runs; i += 20) {
// add items.
for (int j = 0; j < 20; j+=2)
objects.add(i);
// remove from the end.
while (!objects.isEmpty())
objects.remove(objects.size() - 1);
}
long time = System.nanoTime() - start;
System.out.printf("%s each add/remove took an average of %.1f ns%n", objects.getClass().getSimpleName(), (double) time/runs);
}
in
Vector each add/remove took an average of 38.9 ns
ArrayList each add/remove took an average of 6.4 ns
Vector each add/remove took an average of 10.5 ns
ArrayList each add/remove took an average of 6.2 ns
Vector each add/remove took an average of 10.4 ns
ArrayList each add/remove took an average of 5.7 ns
Từ quan điểm thực hiện xem, nếu 4 ns là quan trọng với bạn, bạn phải sử dụng phiên bản không đồng bộ.
Đối với 99% trường hợp sử dụng, độ rõ của mã quan trọng hơn hiệu suất. Rõ ràng, mã đơn giản thường thực hiện tốt một cách hợp lý.
BTW: Tôi đang sử dụng 4,6 GHz i7 2600 với Oracle Java 7u1.
Để so sánh nếu tôi làm như sau trong đó perfTest1,2,3 là giống nhau.
perfTest1(new ArrayList<Integer>());
perfTest2(new Vector<Integer>());
perfTest3(Collections.synchronizedList(new ArrayList<Integer>()));
tôi nhận được
ArrayList each add/remove took an average of 2.6 ns
Vector each add/remove took an average of 7.5 ns
SynchronizedRandomAccessList each add/remove took an average of 8.9 ns
Nếu tôi sử dụng một perfTest
phương pháp phổ biến nó không thể inline mã như một cách tối ưu và tất cả chúng đều chậm
ArrayList each add/remove took an average of 9.3 ns
Vector each add/remove took an average of 12.4 ns
SynchronizedRandomAccessList each add/remove took an average of 13.9 ns
Trao đổi thứ tự của các bài kiểm tra
ArrayList each add/remove took an average of 3.0 ns
Vector each add/remove took an average of 39.7 ns
ArrayList each add/remove took an average of 2.0 ns
Vector each add/remove took an average of 4.6 ns
ArrayList each add/remove took an average of 2.3 ns
Vector each add/remove took an average of 4.5 ns
ArrayList each add/remove took an average of 2.3 ns
Vector each add/remove took an average of 4.4 ns
ArrayList each add/remove took an average of 2.4 ns
Vector each add/remove took an average of 4.6 ns
cùng một lúc
ArrayList each add/remove took an average of 3.0 ns
ArrayList each add/remove took an average of 3.0 ns
ArrayList each add/remove took an average of 2.3 ns
ArrayList each add/remove took an average of 2.2 ns
ArrayList each add/remove took an average of 2.4 ns
và
Vector each add/remove took an average of 28.4 ns
Vector each add/remove took an average of 37.4 ns
Vector each add/remove took an average of 7.6 ns
Vector each add/remove took an average of 7.6 ns
Vector each add/remove took an average of 7.6 ns
đẹp như bài viết đó là, mọi thứ đã phát triển rất nhiều ** ** vì nó đã được viết cách đây mười năm. – NPE
câu trả lời ngắn gọn! – bestsss
Câu trả lời dài: có. JVM sẽ luôn luôn cần phải giải quyết xem khóa của đối tượng có sẵn hay không, bất kể Java đã phát triển như thế nào. –