1. Phân tích và cải tiến
Mục tiêu của việc tối ưu hóa mã nguồn bao gồm:
- Quản lý vòng đời của đối tượng và biến.
- Kiểm soát số lượng đối tượng và biến được tạo ra.
Về quản lý vòng đời
Cốt lõi là đảm bảo các đối tượng/điều chỉ tồn tại khi cần thiết và loại bỏ khi không còn dùng đến, giảm thiểu sử dụng bộ nhớ và tài nguyên không cần thiết.
// Không khuyến khích: Biến toàn cục tồn tại lâu dài
let danhSachToanCuc = [];
function xuLyDuLieu() {
danhSachToanCuc = layDuLieuLon(); // Vẫn chiếm bộ nhớ sau xử lý
}
// Khuyến khích: Biến cục bộ tự động giải phóng
function xuLyDuLieu() {
let danhSachCucBo = layDuLieuLon(); // Tự giải phóng sau khi hàm kết thúc
// Xử lý logic...
}
Về kiểm soát số lượng đối tượng
Tập trung vào việc giảm số lượng đối tượng không cần thiết và quản lý tổng số đối tượng hoạt động để giảm tải cho bộ nhớ và quá trình thu gom rác (GC).
// Không khuyến khích: Tạo mới nhiều đối tượng trong vòng lặp
for (int i = 0; i < 1000; i++) {
DoiTuong obj = new DoiTuong(); // Mỗi lần vòng lặp tạo mới một đối tượng
}
// Khuyến khích: Tái sử dụng đối tượng
DoiTuong obj = new DoiTuong();
for (int i = 0; i < 1000; i++) {
obj.taiDat(); // Đặt lại trạng thái thay vì tạo mới
// Sử dụng đối tượng
}
2. Mẫu Builder và tối ưu hóa hiệu suất
Mẫu Builder giúp kiểm soát quy trình tạo đối tượng tinh vi hơn, từ đó tối ưu hóa hiệu suất ở nhiều cấp độ khác nhau.
Hạn chế các thao tác dư thừa trong quá trình tạo đối tượng
// Cách truyền thống: Có thể khởi tạo thuộc tính không cần thiết
class DoiTuongPhucTap {
private A a;
private B b;
public DoiTuongPhucTap() {
this.a = new A(); // Có thể dư thừa
this.b = new B(); // Có thể dư thừa
}
}
// Mẫu Builder: Chỉ khởi tạo những gì cần thiết
class DoiTuongPhucTapBuilder {
private A a;
private B b;
public DoiTuongPhucTapBuilder setA(A a) {
this.a = a;
return this;
}
public DoiTuongPhucTapBuilder setB(B b) {
this.b = b;
return this;
}
public DoiTuongPhucTap xayDung() {
DoiTuongPhucTap doiTuong = new DoiTuongPhucTap();
if (a != null) doiTuong.setA(a);
if (b != null) doiTuong.setB(b);
return doiTuong;
}
}
Giảm số lượng đối tượng tạm thời
// Cách truyền thống: Tạo nhiều chuỗi tạm thời
String ketQua = "ten: " + ten + ", tuoi: " + tuoi + ", email: " + email;
// Mẫu Builder (như StringBuilder): Không có đối tượng tạm thời
StringBuilder builder = new StringBuilder();
builder.append("ten: ").append(ten)
.append(", tuoi: ").append(tuoi)
.append(", email: ").append(email);
String ketQua = builder.toString(); // Chỉ tạo một đối tượng cuối cùng