EV-Etcd
view release on metacpan or search on metacpan
#!/usr/bin/env perl
use strict;
use warnings;
use Time::HiRes qw(time);
use lib 'blib/lib', 'blib/arch';
$| = 1; # Autoflush
use EV;
use EV::Etcd;
# Check if etcd is running
my $etcd_running = 0;
eval {
my $result = `etcdctl endpoint health 2>&1`;
$etcd_running = 1 if $result =~ /is healthy/;
};
die "etcd not running\n" unless $etcd_running;
my $client = EV::Etcd->new(
endpoints => ['127.0.0.1:2379'],
);
my $prefix = "/bench_$$";
my $iterations = $ENV{BENCH_ITER} || 1000;
print "EV::Etcd Benchmark\n";
print "==================\n\n";
# Benchmark 1: Sequential puts
{
print "1. Sequential PUTs ($iterations iterations)...\n";
my $completed = 0;
my $start = time();
for my $i (1..$iterations) {
$client->put("$prefix/key$i", "value$i", sub {
my ($resp, $err) = @_;
die "PUT error: $err->{message}" if $err;
$completed++;
EV::break;
});
EV::run;
}
my $elapsed = time() - $start;
printf " Time: %.3f sec, Rate: %.0f ops/sec, Latency: %.2f ms/op\n\n",
$elapsed, $iterations / $elapsed, ($elapsed / $iterations) * 1000;
}
# Benchmark 2: Sequential gets
{
print "2. Sequential GETs ($iterations iterations)...\n";
my $completed = 0;
my $start = time();
for my $i (1..$iterations) {
$client->get("$prefix/key$i", sub {
my ($resp, $err) = @_;
die "GET error: $err->{message}" if $err;
$completed++;
EV::break;
});
EV::run;
}
my $elapsed = time() - $start;
printf " Time: %.3f sec, Rate: %.0f ops/sec, Latency: %.2f ms/op\n\n",
$elapsed, $iterations / $elapsed, ($elapsed / $iterations) * 1000;
}
# Benchmark 3: Pipelined puts (bounded concurrency)
{
my $concurrency = $ENV{BENCH_CONCURRENCY} || 100;
print "3. Pipelined PUTs ($iterations iterations, concurrency=$concurrency)...\n";
my $completed = 0;
my $sent = 0;
my $in_flight = 0;
my $start = time();
my $send_batch; $send_batch = sub {
( run in 1.345 second using v1.01-cache-2.11-cpan-524268b4103 )