11package io .getstream .chat .java ;
22
33import io .getstream .chat .java .models .User ;
4+ import io .getstream .chat .java .services .UserService ;
5+ import io .getstream .chat .java .services .framework .DefaultClient ;
46import org .junit .jupiter .api .Test ;
7+ import java .lang .management .ManagementFactory ;
58
69public class CustomTest {
710
@@ -14,27 +17,85 @@ void customTest() throws Exception {
1417 }
1518
1619
17- @ Test
18- void userReqTest () throws Exception {
19- var userId = "han_solo" ;
20- var userToken = User .createToken ("han_solo" , null , null );
21- var response = User .list ().filterCondition ("id" , userId ).withUserToken (userToken ).request ();
22- System .out .println ("\n > " + response + "\n " );
20+ @ Test
21+ void userReqTest () throws Exception {
22+ var userId = "han_solo" ;
23+ var userToken = User .createToken ("han_solo" , null , null );
24+ var response = User .list ().filterCondition ("id" , userId ).withUserToken (userToken ).request ();
25+ System .out .println ("\n > " + response + "\n " );
26+ }
27+
28+ @ Test
29+ void measureClientCreate () throws Exception {
30+ var userId = "han_solo" ;
31+ var userToken = User .createToken (userId , null , null );
32+
33+ // Test creating a UserClient directly - should use Client-Side auth
34+ var defaultClient = new DefaultClient ();
35+
36+ var iterations = 10_000_000 ;
37+
38+ // Warm up JVM to avoid cold start effects
39+ for (int i = 0 ; i < 10_000 ; i ++) {
40+ defaultClient .create (UserService .class , userToken );
41+ defaultClient .create2 (UserService .class , userToken );
2342 }
2443
25- @ Test
26- void directClientTest () throws Exception {
27- var userId = "han_solo" ;
28- var userToken = User .createToken ("han_solo" , null , null );
29-
30- // Test creating a UserClient directly - should use Client-Side auth
31- var defaultClient = io .getstream .chat .java .services .framework .Client .getInstance ();
32- var userClient = new io .getstream .chat .java .services .framework .UserClient (defaultClient , userToken );
33-
34- var response = User .list ()
35- .filterCondition ("id" , userId )
36- .withClient (userClient )
37- .request ();
38- System .out .println ("\n > Direct UserClient: " + response + "\n " );
44+ // Get ThreadMXBean for accurate memory allocation tracking
45+ com .sun .management .ThreadMXBean threadBean =
46+ (com .sun .management .ThreadMXBean ) ManagementFactory .getThreadMXBean ();
47+
48+ // Measure first test
49+ long allocatedBefore1 = threadBean .getCurrentThreadAllocatedBytes ();
50+ long startTime = System .nanoTime ();
51+ for (int i = 0 ; i < iterations ; i ++) {
52+ defaultClient .create (UserService .class , userToken );
3953 }
54+ long endTime = System .nanoTime ();
55+ long allocatedAfter1 = threadBean .getCurrentThreadAllocatedBytes ();
56+ long elapsedTime1 = endTime - startTime ;
57+ long allocated1 = allocatedAfter1 - allocatedBefore1 ;
58+
59+ System .out .println ("=========================================================" );
60+
61+ System .out .println ("> First loop elapsed time: " + (elapsedTime1 / 1_000_000 ) + " ms" );
62+ System .out .println ("> First loop memory allocated: " + (allocated1 / 1024 / 1024 ) + " MB" );
63+ System .out .println ("> First loop avg time per call: " + (elapsedTime1 / (double ) iterations ) + " ns" );
64+ System .out .println ("> First loop avg memory per call: " + (allocated1 / (double ) iterations ) + " bytes" );
65+
66+ // Measure second test
67+ long allocatedBefore2 = threadBean .getCurrentThreadAllocatedBytes ();
68+ startTime = System .nanoTime ();
69+ for (int i = 0 ; i < iterations ; i ++) {
70+ defaultClient .create2 (UserService .class , userToken );
71+ }
72+ endTime = System .nanoTime ();
73+ long allocatedAfter2 = threadBean .getCurrentThreadAllocatedBytes ();
74+ long elapsedTime2 = endTime - startTime ;
75+ long allocated2 = allocatedAfter2 - allocatedBefore2 ;
76+
77+ System .out .println ("> Second loop elapsed time: " + (elapsedTime2 / 1_000_000 ) + " ms" );
78+ System .out .println ("> Second loop memory allocated: " + (allocated2 / 1024 / 1024 ) + " MB" );
79+ System .out .println ("> Second loop avg time per call: " + (elapsedTime2 / (double ) iterations ) + " ns" );
80+ System .out .println ("> Second loop avg memory per call: " + (allocated2 / (double ) iterations ) + " bytes" );
81+
82+ // Performance comparison
83+ if (elapsedTime1 < elapsedTime2 ) {
84+ double timesFaster = (double ) elapsedTime2 / elapsedTime1 ;
85+ System .out .println ("> create is " + String .format ("%.2fx" , timesFaster ) + " faster than create2" );
86+ } else {
87+ double timesFaster = (double ) elapsedTime1 / elapsedTime2 ;
88+ System .out .println ("> create2 is " + String .format ("%.2fx" , timesFaster ) + " faster than create" );
89+ }
90+
91+ if (allocated1 < allocated2 ) {
92+ double timesLess = (double ) allocated2 / allocated1 ;
93+ System .out .println ("> create allocates " + String .format ("%.2fx" , timesLess ) + " less memory than create2" );
94+ } else {
95+ double timesLess = (double ) allocated1 / allocated2 ;
96+ System .out .println ("> create2 allocates " + String .format ("%.2fx" , timesLess ) + " less memory than create" );
97+ }
98+
99+ System .out .println ("======================================================================" );
100+ }
40101}
0 commit comments