- JGentle sử dụng đến 3 layer cache, để cache cho toàn bộ quá trình
khởi tạo 1 bean instance. Caching layer-1 là cache block sử dụng trong
trường hợp bean không hề có bất kì một sự thay đổi nào, caching
layer-2 sử dụng trong trường hợp bean definition có thay đổi trong
lúc run-time, bean cần khởi tạo có sự thay đổi về mặt chức năng tại 1
số vị trí nào đó (nhưng bản chất vẫn là definition đó), caching
layer-3 là cơ chế cache của riêng CGLib sử dụng trong trường hợp
definition hoàn toàn thay đổi.
- Bài test của em get ra 1000 bean (singleton) thực chất chỉ là lấy từ
trong cache layer-1 ra mà thôi, còn nếu get ra 1000 bean (prototype)
thực chất là lấy từ trong cache layer-2 ra nhưng đối với Spring thì
tất cả thông tin definition đều là tĩnh (config tĩnh trên XML) nên
thực chất cũng không khác cache layer-1 là mấy, ngoại trừ phải mất
thêm 1 khoảng thời gian instantiate bean để tạo ra 1 bean mới thay vì
lấy bean có sẵn trong cache như Singleton. Còn trong JGentle,
definition hoàn toàn có thể thay đổi lúc run-time, nên cache layer-2
của JGentle có đến 2 phần công việc khác nhau, 1 phần tương tự như
Spring chỉ đơn giản lấy ra từ trong cache toàn bộ cách thức và thao
tác khởi tạo bean sau đó sử dụng để instantiate bean, phần còn lại sử
dụng trong trường hợp definition đã có sự thay đổi. Tốc độ getbean
Prototype trong revision hiện tại không được tốt chính là do có 1 số
trục trặc ngay tại chỗ này :). Hiện giờ anh cũng đã fix xong chỗ này,
nhưng chưa commit do phần thay đổi gây ra bug 1 số chỗ khác. Sẽ nhanh
thôi !! :)
ps: sử dụng pure reflection mới là cho tốc độ tồi nhất. CGLib nổi
tiếng 1 phần do tính năng nhưng cũng 1 phần là vì performance của nó
tốt.
Nhưng em có 1 vài điểm thắc mắc nhỏ thôi:
+ Trong ví dụ test của em không dùng đến bất kì thông tin gì khác
ngoài ioc thông thường(không invocation,...)
+Và theo anh thi viêc tạo instance cho nó sẽ chỉ sử dụng refaction?
+Đây là 2 kết quả Systen.out.prinltn của jgentle và spring:
+Jgentle: org.samples.KnightElf$$EnhancerByJGentle$$8ba5c383@81b1fb
+Spring: org.samples.KnightElf@3b8b49
+Nếu như bean không dùng đến invocation,... thi nó phải được khởi tạo
= refaction chứ ? như theo kết quả test này em thấy rõ ràng bean được
khởi tạo kô = cơ chế pure refaction?
PS : Không xét tới các tính năng khác invocation,aop ,.....thì hình
như việc get bean(thông thường không có invocation,aop ,...) của mình
sẽ chậm hơn srping do không dùng pure refaction.
Còn cái thông tin "org.samples.KnightElf$$EnhancerByJGentle$
$8ba5c383@81b1fb" này là do chính anh thêm vào để container có thể
phân biệt JGentle bean hay những bean của các container khác chứ không
phải cái gì đặc biệt. Thực chất cái này chỉ cần chỉnh lại thì muốn in
ra cái gì chẳng được, anh muốn in tên của anh vào đấy còn được nữa
là :D.
Trong JGentle không phải cứ không invocation, ko AOP, ... là ko dùng
CGLib mà còn tùy thuộc vào nhiều yếu tố khác. VD như trong trường hợp
class ko có interface như trên thì dùng reflection làm sao đây ?? Hiện
tại trong JGentle vẫn còn một số chỗ sử dụng pure reflection để khởi
tạo instance nhưng trong tương lai anh cũng sẽ thay thế hết = CGLib,
lý do 1 là vì performance không được tốt, 2 là không đồng bộ hóa với
các JGentle bean khác. Nhắc lại sử dụng pure reflection luôn chậm hơn
so với dùng CGLib.
ps: mà sao em cứ viết là refaction thế, nhầm nhọt sang refactor à.
On Jul 19, 8:29 pm, skydunkpro <skydunk...@gmail.com> wrote:
> hehe, đọc kĩ lại thì anh mới là đang nhầm nhọt từ AOP sang IOC. Đúng
> là nếu chỉ khởi tạo 1 bean thì sử dụng reflection sẽ nhanh hơn chút
> đỉnh so với CGLib vì em chỉ cần class.newInstance() thôi mà nhưng xét
> trong trường hợp khởi tạo từ 2 bean trở lên hay như trong VD của em là
> 1000 bean thì CGLib luôn cho performance tốt hơn. (nhờ vào cơ chế
> cache của CGLib) :) . Chính vì thế nên trong các revision sắp tới anh
> sẽ thay thế toàn bộ = CGLib.
>
> On 20 Tháng Bảy, 10:13, skydunkpro <skydunk...@gmail.com> wrote:
>
>
>
> > Thế em nghĩ là "KnightElf@3b8b49" có nghĩa là pure reflection à ???
> > thực chất class KinghtElf không thể dùng reflection để khởi tạo
> > instance vì class này không hề có interface. Spring chỉ sử dụng
> > reflection để khởi tạo instance khi class chỉ định có implements
> > interface đầu đủ mà thôi. Còn tất cả các trường hợp còn lại Spring đều
> > dùng CGLib hết. Mà đấy là trong Spring 2.0 chứ trong 2.5 hay 3.0 hình
> > như nó cũng bỏ reflection hết rồi.
>
> > Còn cái thông tin "org.samples.KnightElf$$EnhancerByJGentle$
> > $8ba5c383@81b1fb" này là do chính anh thêm vào để container có thể
> > phân biệt JGentle bean hay những bean của các container khác chứ không
> > phải cái gì đặc biệt. Thực chất cái này chỉ cần chỉnh lại thì muốn in
> > ra cái gì chẳng được, anh muốn in tên của anh vào đấy còn được nữa
> > là :D.
>
> > Trong JGentle không phải cứ không invocation, ko AOP, ... là ko dùng
> > CGLib mà còn tùy thuộc vào nhiều yếu tố khác. VD như trong trường hợp
> > class ko có interface như trên thì dùng reflection làm sao đây ?? Hiện
> > tại trong JGentle vẫn còn một số chỗ sử dụng pure reflection để khởi
> > tạo instance nhưng trong tương lai anh cũng sẽ thay thế hết = CGLib,
> > lý do 1 là vì performance không được tốt, 2 là không đồng bộ hóa với
> > các JGentle bean khác. Nhắc lại sử dụng pure reflection luôn chậm hơn
> > so với dùng CGLib.
>
> > ps: mà sao em cứ viết là refaction thế, nhầm nhọt sang refactor à.
>