11use futures:: future:: try_join_all;
2- use std:: env;
2+ use std:: env:: var ;
33use std:: error:: Error ;
44use std:: sync:: Arc ;
5- use std:: time:: Instant ;
5+ use std:: time:: { Duration , Instant } ;
66
7- const TEST_URL : & str = env ! ( "TEST_URL" ) ;
7+ const TASKS : u128 = 1000 ;
8+ const QUERIES : u128 = 100 ;
89
9- #[ async_std:: test]
10- async fn async_runtime ( ) -> Result < ( ) , Box < dyn Error > > {
10+ #[ test]
11+ fn benchmark ( ) -> Result < ( ) , Box < dyn Error > > {
12+ let queries = TASKS * QUERIES ;
13+ let tcp_url = var ( "TCP_URL" ) ?;
14+ let uds_url = var ( "UDS_URL" ) ?;
15+ let mut tokio_rr = tokio:: runtime:: Runtime :: new ( ) ?;
16+
17+ println ! ( "Benchmark concurrency({}), queries({}):" , TASKS , queries) ;
18+ println ! ( " - async-postgres on async-std runtime:" ) ;
19+ let elapsed = async_std:: task:: block_on ( async_runtime ( & tcp_url) ) ?;
20+ println ! ( " - tcp: {} us/q" , elapsed. as_micros( ) / queries) ;
21+ let elapsed = async_std:: task:: block_on ( async_runtime ( & uds_url) ) ?;
22+ println ! ( " - uds: {} us/q" , elapsed. as_micros( ) / queries) ;
23+ println ! ( " - async-postgres on tokio runtime:" ) ;
24+ let elapsed = tokio_rr. block_on ( tokio_runtime ( & tcp_url) ) ?;
25+ println ! ( " - tcp: {} us/q" , elapsed. as_micros( ) / queries) ;
26+ let elapsed = tokio_rr. block_on ( tokio_runtime ( & uds_url) ) ?;
27+ println ! ( " - uds: {} us/q" , elapsed. as_micros( ) / queries) ;
28+ println ! ( " - tokio_postgres on tokio runtime:" ) ;
29+ let elapsed = tokio_rr. block_on ( tokio_postgres ( & tcp_url) ) ?;
30+ println ! ( " - tcp: {} us/q" , elapsed. as_micros( ) / queries) ;
31+ // let elapsed = tokio_rr.block_on(tokio_postgres(&uds_url))?;
32+ // println!(" - uds: {} us/q", elapsed.as_micros() / queries);
33+ Ok ( ( ) )
34+ }
35+
36+ async fn async_runtime ( url : & str ) -> Result < Duration , Box < dyn Error > > {
1137 use async_std:: task:: spawn;
12- let ( client, conn) = async_postgres:: connect ( TEST_URL . parse ( ) ?) . await ?;
38+ let ( client, conn) = async_postgres:: connect ( url . parse ( ) ?) . await ?;
1339 spawn ( conn) ;
1440 let shared_client = Arc :: new ( client) ;
1541 let stmt = shared_client
1642 . prepare ( "SELECT * FROM posts WHERE id=$1" )
1743 . await ?;
1844 let start = Instant :: now ( ) ;
19- let tasks = ( 0 ..1000 ) . map ( |_| {
45+ let tasks = ( 0 ..TASKS ) . map ( |_| {
2046 let client = shared_client. clone ( ) ;
2147 let stmt = stmt. clone ( ) ;
2248 spawn ( async move {
23- let queries = ( 0 ..100 ) . map ( |_| client. query_one ( & stmt, & [ & 1i32 ] ) ) ;
49+ let queries = ( 0 ..QUERIES ) . map ( |_| client. query_one ( & stmt, & [ & 1i32 ] ) ) ;
2450 try_join_all ( queries) . await
2551 } )
2652 } ) ;
2753 let results = try_join_all ( tasks) . await ?;
28- let avg_elapsed = start. elapsed ( ) . as_micros ( ) / 100_000 ;
54+ let elapsed = start. elapsed ( ) ;
2955 // check
3056 for rows in results {
3157 for row in rows {
@@ -36,14 +62,12 @@ async fn async_runtime() -> Result<(), Box<dyn Error>> {
3662 ) ;
3763 }
3864 }
39- println ! ( "1000 concurrency; {} us/q" , avg_elapsed) ;
40- Ok ( ( ) )
65+ Ok ( elapsed)
4166}
4267
43- #[ tokio:: test]
44- async fn tokio_runtime ( ) -> Result < ( ) , Box < dyn Error > > {
68+ async fn tokio_runtime ( url : & str ) -> Result < Duration , Box < dyn Error > > {
4569 use tokio:: spawn;
46- let ( client, conn) = async_postgres:: connect ( TEST_URL . parse ( ) ?) . await ?;
70+ let ( client, conn) = async_postgres:: connect ( url . parse ( ) ?) . await ?;
4771 spawn ( conn) ;
4872 let shared_client = Arc :: new ( client) ;
4973 let stmt = shared_client
@@ -59,7 +83,7 @@ async fn tokio_runtime() -> Result<(), Box<dyn Error>> {
5983 } )
6084 } ) ;
6185 let results = try_join_all ( tasks) . await ?;
62- let avg_elapsed = start. elapsed ( ) . as_micros ( ) / 100_000 ;
86+ let elapsed = start. elapsed ( ) ;
6387 // check
6488 for rows in results {
6589 for row in rows? {
@@ -70,15 +94,13 @@ async fn tokio_runtime() -> Result<(), Box<dyn Error>> {
7094 ) ;
7195 }
7296 }
73- println ! ( "1000 concurrency; {} us/q" , avg_elapsed) ;
74- Ok ( ( ) )
97+ Ok ( elapsed)
7598}
7699
77- #[ tokio:: test]
78- async fn tokio_postgres ( ) -> Result < ( ) , Box < dyn Error > > {
100+ async fn tokio_postgres ( url : & str ) -> Result < Duration , Box < dyn Error > > {
79101 use tokio:: spawn;
80102 use tokio_postgres:: NoTls ;
81- let ( client, conn) = tokio_postgres:: connect ( & TEST_URL , NoTls ) . await ?;
103+ let ( client, conn) = tokio_postgres:: connect ( url , NoTls ) . await ?;
82104 spawn ( conn) ;
83105 let shared_client = Arc :: new ( client) ;
84106 let stmt = shared_client
@@ -96,7 +118,7 @@ async fn tokio_postgres() -> Result<(), Box<dyn Error>> {
96118 } )
97119 . collect :: < Vec < _ > > ( ) ;
98120 let results = try_join_all ( tasks) . await ?;
99- let avg_elapsed = start. elapsed ( ) . as_micros ( ) / 100_000 ;
121+ let elapsed = start. elapsed ( ) ;
100122 // check
101123 for rows in results {
102124 for row in rows? {
@@ -107,6 +129,5 @@ async fn tokio_postgres() -> Result<(), Box<dyn Error>> {
107129 ) ;
108130 }
109131 }
110- println ! ( "1000 concurrency; {} us/q" , avg_elapsed) ;
111- Ok ( ( ) )
132+ Ok ( elapsed)
112133}
0 commit comments