View this page "Spring VS Jgentle"

0 views
Skip to first unread message

myname74119

unread,
Jul 17, 2009, 5:17:07 AM7/17/09
to JGentleGroup


Click on http://groups.google.com/group/jgentlegroup/web/spring-vs-jgentle
- or copy & paste it into your browser's address bar if that doesn't
work.

skydunkpro

unread,
Jul 17, 2009, 12:01:51 PM7/17/09
to JGentleGroup
Đã fix performance trên các singleton bean, hiện tại prototype bean
tốc độ getbean vẫn chưa tốt, nguyên nhân có lẽ trong lúc developer,
chỉnh sửa lung tung :D. Để ngày mai anh xem lại, giờ thử update
revision mới nhất và test lại xem. Trên máy anh JGentle nhanh gấp đôi
Spring.

On Jul 17, 4:17 pm, myname74119 <myname74...@gmail.com> wrote:
> Click onhttp://groups.google.com/group/jgentlegroup/web/spring-vs-jgentle

skydunkpro

unread,
Jul 17, 2009, 12:05:26 PM7/17/09
to JGentleGroup
tốc độ getBean chỉ vào khoảng 1->2 ms cho 1000 bean. Cấu hình core2duo
1,83, Ram 4G, Vista 64 home.

On Jul 17, 4:17 pm, myname74119 <myname74...@gmail.com> wrote:
> Click onhttp://groups.google.com/group/jgentlegroup/web/spring-vs-jgentle

myname74119

unread,
Jul 17, 2009, 9:18:13 PM7/17/09
to JGentleGroup

Sau khi update revision mới nhất về và chạy test và kết quả mới như sau
(Cấu hình như cũ nha :D ):

Jgentle:

Lần 1:
Init container in :2484 mili second(s)
Get 1000 Bean :47 mili second(s)
Total time :2531 mili second(s)
Lần 2:
Init container in :703 mili second(s)
Get 1000 Bean :31 mili second(s)
Total time :734 mili second(s)
Lần 3:
Init container in :719 mili second(s)
Get 1000 Bean :31 mili second(s)
Total time :750 mili second(s)
Lần 4:
Init container in :704 mili second(s)
Get 1000 Bean :31 mili second(s)
Total time :735 mili second(s)

Lần 5:
Init container in :718 mili second(s)
Get 1000 Bean :32 mili second(s)
Total time :750 mili second(s)

Thời gian trung bình:

Init container in :1065.6 mili second(s)
Get 1000 Bean :34.4 mili second(s)
Total time :1100 mili second(s)

Quả nhiên là sau khi update revision mới tốc độ get bean trong jgentle
đã tăng lên rất nhiều (193.8/34.4 = 5.63 Lần).

myname74119

unread,
Jul 19, 2009, 10:59:07 AM7/19/09
to JGentleGroup
Spring:
+ Dùng refaction để tạo instance phần IOC
JGentle:
+ Luôn dùng cglib để tạo instance cho IOC.

Kết luận:
Jgentle get bean với scope prototype luôn chậm hơn spring( dùng cglib
để tạo instance > dùng refaction để tạo instance).

skydunkpro

unread,
Jul 19, 2009, 9:51:57 PM7/19/09
to JGentleGroup
Sai rồi Tùng, em đọc code của anh không kĩ rồi, thật sự JGentle chỉ sử
dụng CGLib để khởi tạo instance khi và chỉ khi cần thiết, vd
invocation injection hay AOP hay interceptor, ... trong 1 số trường
hợp khác JGentle vẫn sử dụng reflection. Việc sử dụng reflection không
phải để nhanh hơn mà để đơn giản hóa các thao tác không cần thiết, và
những thành phần đó thật ra không tận dụng được cơ chế caching ở layer
3 (cơ chế caching của riêng CGLib). Chứ nếu nói về performance thì
CGLib luôn cho tốc độ tốt hơn sử dụng reflection thông thường. Việc
performance khác nhau như thế nào phụ thuộc nhiều vào cơ chế cache chứ
không phải ở thao tác instantiation.

- 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.

myname74119

unread,
Jul 19, 2009, 10:14:13 PM7/19/09
to JGentleGroup
OK, Anh Chung.
Qủa thật là em chưa đọc code kỹ thật bởi em chi test và chưa xem kĩ
code.

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.

skydunkpro

unread,
Jul 19, 2009, 11:13:53 PM7/19/09
to JGentleGroup
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 à.

skydunkpro

unread,
Jul 19, 2009, 11:29:25 PM7/19/09
to JGentleGroup
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.

myname74119

unread,
Jul 20, 2009, 1:16:47 AM7/20/09
to JGentleGroup
Em search dc cái này:
http://sixlegs.com/blog/java/cglib-fastclass.html

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 à.
>

skydunkpro

unread,
Jul 20, 2009, 1:22:34 AM7/20/09
to JGentleGroup
xem kĩ code của JGentle, em sẽ thấy JGentle ko những sử dụng
FastClass, FastConstructor, FastMethod, .... mà còn nhiều thứ khác :D
Reply all
Reply to author
Forward
0 new messages