11use strict;
22use warnings FATAL => ' all' ;
3+ use feature qw/ say/ ;
4+ use lib " ." ;
5+ use lib " ./_build/lib" ;
6+ use lib " ./blib/arch" ;
7+ use lib " ./blib/lib" ;
38use lib ' ./xt/lib' ;
4- use Benchmark;
9+
10+ use Time::HiRes qw/ gettimeofday tv_interval/ ;
511use Redis::Cluster::Fast;
612use Redis::ClusterRider;
7- use Test::More; # for Test::RedisCluster
8- use Test::Docker::RedisCluster qw/ get_startup_nodes/ ;
9-
10- print " Redis::Cluster::Fast is " . $Redis::Cluster::Fast::VERSION . " \n " ;
11- print " Redis::ClusterRider is " . $Redis::ClusterRider::VERSION . " \n " ;
1213
13- my $nodes = get_startup_nodes;
14+ my $nodes_str = $ENV {REDIS_NODES };
15+ my $nodes = [
16+ split (/ ,/ , $nodes_str )
17+ ];
1418
1519my $xs = Redis::Cluster::Fast-> new(
1620 startup_nodes => $nodes ,
21+ route_use_slots => 1,
1722);
1823
1924my $pp = Redis::ClusterRider-> new(
2025 startup_nodes => $nodes ,
2126);
2227
23- my $cc = 0;
24- my $dd = 0;
25-
2628my $loop = 100000;
27- print " ### mset ###\n " ;
28- Benchmark::cmpthese($loop , {
29- " Redis::ClusterRider" => sub {
30- $cc ++;
31- $pp -> mset(" {pp$cc }atest" , $cc , " {pp$cc }btest" , $cc , " {pp$cc }ctest" , $cc );
32- },
33- " Redis::Cluster::Fast" => sub {
34- $dd ++;
35- $xs -> mset(" {xs$dd }atest" , $dd , " {xs$dd }btest" , $dd , " {xs$dd }ctest" , $dd );
36- },
37- });
38-
39- $cc = 0;
40- $dd = 0;
41-
42- print " ### mget ###\n " ;
43- Benchmark::cmpthese($loop , {
44- " Redis::ClusterRider" => sub {
45- $cc ++;
46- $pp -> mget(" {pp$cc }atest" , " {pp$cc }btest" , " {pp$cc }ctest" );
47- },
48- " Redis::Cluster::Fast" => sub {
49- $dd ++;
50- $xs -> mget(" {xs$dd }atest" , " {xs$dd }btest" , " {xs$dd }ctest" );
51- },
52- });
53-
54- print " ### incr ###\n " ;
55- Benchmark::cmpthese(-2, {
56- " Redis::ClusterRider" => sub {
57- $pp -> incr(" incr_1" );
58- },
59- " Redis::Cluster::Fast" => sub {
60- $xs -> incr(" incr_2" );
61- },
62- });
63-
64- print " ### new and ping ###\n " ;
65- Benchmark::cmpthese(-2, {
66- " Redis::ClusterRider" => sub {
67- my $tmp = Redis::ClusterRider-> new(
68- startup_nodes => $nodes ,
69- );
70- $tmp -> ping;
71- },
72- " Redis::Cluster::Fast" => sub {
73- my $tmp = Redis::Cluster::Fast-> new(
74- startup_nodes => $nodes ,
75- );
76- $tmp -> ping;
77- },
78- });
79-
80- is 1, 1;
81- done_testing;
82- __END__
83- % AUTHOR_TESTING=1 perl ./examples/benchmark-simple.pl
84- Redis::Cluster::Fast is 0.084
85- Redis::ClusterRider is 0.26
86- ### mset ###
87- Rate Redis::ClusterRider Redis::Cluster::Fast
88- Redis::ClusterRider 13245/s -- -34%
89- Redis::Cluster::Fast 20080/s 52% --
90- ### mget ###
91- Rate Redis::ClusterRider Redis::Cluster::Fast
92- Redis::ClusterRider 14641/s -- -40%
93- Redis::Cluster::Fast 24510/s 67% --
94- ### incr ###
95- Rate Redis::ClusterRider Redis::Cluster::Fast
96- Redis::ClusterRider 18367/s -- -44%
97- Redis::Cluster::Fast 32879/s 79% --
98- ### new and ping ###
99- Rate Redis::ClusterRider Redis::Cluster::Fast
100- Redis::ClusterRider 146/s -- -96%
101- Redis::Cluster::Fast 3941/s 2598% --
102- ok 1
103- 1..1
29+
30+ # #####
31+ # set
32+ # #####
33+ sleep 1;
34+ for my $num (1 .. $loop ) {
35+ my $start_time = [ gettimeofday ];
36+
37+ $xs -> set(' 1' . $num , 123);
38+
39+ my $elapsed_time = tv_interval($start_time );
40+ printf " set_xs,%.10f\n " , $elapsed_time * 1000;
41+ }
42+ sleep 1;
43+ for my $num (1 .. $loop ) {
44+ my $start_time = [ gettimeofday ];
45+
46+ $xs -> set(' 2' . $num , 123, sub {});
47+ $xs -> run_event_loop;
48+
49+ my $elapsed_time = tv_interval($start_time );
50+ printf " set_xs_pipeline,%.10f\n " , $elapsed_time * 1000;
51+ }
52+ sleep 1;
53+ for my $num (1 .. $loop ) {
54+ my $start_time = [ gettimeofday ];
55+
56+ $xs -> set(' 3' . $num , 123, sub {});
57+ $xs -> run_event_loop if $num % 100 == 0;
58+
59+ my $elapsed_time = tv_interval($start_time );
60+ printf " set_xs_pipeline_batched_100,%.10f\n " , $elapsed_time * 1000;
61+ }
62+ sleep 1;
63+ for my $num (1 .. $loop ) {
64+ my $start_time = [ gettimeofday ];
65+
66+ $pp -> set(' 4' . $num , 123);
67+
68+ my $elapsed_time = tv_interval($start_time );
69+ printf " set_pp,%.10f\n " , $elapsed_time * 1000;
70+ }
71+
72+ # #####
73+ # get
74+ # #####
75+ sleep 1;
76+ for my $num (1 .. $loop ) {
77+ my $start_time = [ gettimeofday ];
78+
79+ $xs -> get(' 1' . $num );
80+
81+ my $elapsed_time = tv_interval($start_time );
82+ printf " get_xs,%.10f\n " , $elapsed_time * 1000;
83+ }
84+ sleep 1;
85+ for my $num (1 .. $loop ) {
86+ my $start_time = [ gettimeofday ];
87+
88+ $xs -> get(' 2' . $num , sub {});
89+ $xs -> run_event_loop;
90+
91+ my $elapsed_time = tv_interval($start_time );
92+ printf " get_xs_pipeline,%.10f\n " , $elapsed_time * 1000;
93+ }
94+ sleep 1;
95+ for my $num (1 .. $loop ) {
96+ my $start_time = [ gettimeofday ];
97+
98+ $xs -> get(' 3' . $num , sub {});
99+ $xs -> run_event_loop if $num % 100 == 0;
100+
101+ my $elapsed_time = tv_interval($start_time );
102+ printf " get_xs_pipeline_batched_100,%.10f\n " , $elapsed_time * 1000;
103+ }
104+ sleep 1;
105+ for my $num (1 .. $loop ) {
106+ my $start_time = [ gettimeofday ];
107+
108+ $pp -> get(' 4' . $num );
109+
110+ my $elapsed_time = tv_interval($start_time );
111+ printf " get_pp,%.10f\n " , $elapsed_time * 1000;
112+ }
113+
114+ __END__
0 commit comments