EV-Websockets

 view release on metacpan or  search on metacpan

bench/latency.pl  view on Meta::CPAN

use if -d 'blib', lib => 'blib/lib', 'blib/arch';

use EV;
use AnyEvent;
use AnyEvent::WebSocket::Client;
use EV::Websockets;
use Time::HiRes qw(time);

# Benchmark: Latency (Connection + Handshake time)

my $iterations = 50;

sub bench_ev_websockets {
    print "Benchmarking EV::Websockets Latency ($iterations iterations)...\n";
    my $ctx = EV::Websockets::Context->new();
    my %srv_conns;
    my $port = $ctx->listen(
        port => 0,
        on_connect => sub { $srv_conns{$_[0]} = $_[0] },
        on_close => sub { delete $srv_conns{$_[0]} },
    );
    my @latencies;

    for (1..$iterations) {
        my $start = time;
        my $c; $c = $ctx->connect(
            url => "ws://127.0.0.1:$port",
            on_connect => sub {
                push @latencies, time - $start;
                $_[0]->close;
            },
            on_close => sub { EV::break; },
            on_error => sub { EV::break; },
        );

bench/latency.pl  view on Meta::CPAN

    }

    if (!@latencies) { print "  No latencies recorded.\n"; return 0; }
    my $sum = 0; $sum += $_ for @latencies;
    my $avg = $sum / @latencies;
    printf "  Average Latency: %.4f ms\n\n", $avg * 1000;
    return $avg;
}

sub bench_ae_ws_client {
    print "Benchmarking AnyEvent::WebSocket::Client Latency ($iterations iterations)...\n";
    my $ctx = EV::Websockets::Context->new();
    my %srv_conns;
    my $port = $ctx->listen(
        port => 0,
        on_connect => sub { $srv_conns{$_[0]} = $_[0] },
        on_close => sub { delete $srv_conns{$_[0]} },
    );
    
    my @latencies;

    for (1..$iterations) {
        my $client = AnyEvent::WebSocket::Client->new;
        my $start = time;
        $client->connect("ws://127.0.0.1:$port")->cb(sub {
            my $conn = eval { shift->recv };
            push @latencies, time - $start;
            if ($conn) {
                $conn->on(finish => sub { EV::break; });
                $conn->close;
            } else {
                EV::break;



( run in 0.771 second using v1.01-cache-2.11-cpan-5511b514fd6 )