github.com/daeuniverse/quic-go@v0.0.0-20240413031024-943f218e0810/integrationtests/self/benchmark_test.go (about)

     1  package self_test
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net"
     7  	"testing"
     8  
     9  	"github.com/daeuniverse/quic-go"
    10  )
    11  
    12  func BenchmarkHandshake(b *testing.B) {
    13  	b.ReportAllocs()
    14  
    15  	ln, err := quic.ListenAddr("localhost:0", tlsConfig, nil)
    16  	if err != nil {
    17  		b.Fatal(err)
    18  	}
    19  	defer ln.Close()
    20  
    21  	connChan := make(chan quic.Connection, 1)
    22  	go func() {
    23  		for {
    24  			conn, err := ln.Accept(context.Background())
    25  			if err != nil {
    26  				return
    27  			}
    28  			connChan <- conn
    29  		}
    30  	}()
    31  
    32  	conn, err := net.ListenUDP("udp", nil)
    33  	if err != nil {
    34  		b.Fatal(err)
    35  	}
    36  
    37  	b.ResetTimer()
    38  	for i := 0; i < b.N; i++ {
    39  		c, err := quic.Dial(context.Background(), conn, ln.Addr(), tlsClientConfig, nil)
    40  		if err != nil {
    41  			b.Fatal(err)
    42  		}
    43  		<-connChan
    44  		c.CloseWithError(0, "")
    45  	}
    46  }
    47  
    48  func BenchmarkStreamChurn(b *testing.B) {
    49  	b.ReportAllocs()
    50  
    51  	ln, err := quic.ListenAddr("localhost:0", tlsConfig, &quic.Config{MaxIncomingStreams: 1e10})
    52  	if err != nil {
    53  		b.Fatal(err)
    54  	}
    55  	defer ln.Close()
    56  
    57  	errChan := make(chan error, 1)
    58  	go func() {
    59  		conn, err := ln.Accept(context.Background())
    60  		if err != nil {
    61  			errChan <- err
    62  			return
    63  		}
    64  		close(errChan)
    65  		for {
    66  			str, err := conn.AcceptStream(context.Background())
    67  			if err != nil {
    68  				return
    69  			}
    70  			str.Close()
    71  		}
    72  	}()
    73  
    74  	c, err := quic.DialAddr(context.Background(), fmt.Sprintf("localhost:%d", ln.Addr().(*net.UDPAddr).Port), tlsClientConfig, nil)
    75  	if err != nil {
    76  		b.Fatal(err)
    77  	}
    78  	if err := <-errChan; err != nil {
    79  		b.Fatal(err)
    80  	}
    81  
    82  	b.ResetTimer()
    83  	for i := 0; i < b.N; i++ {
    84  		str, err := c.OpenStreamSync(context.Background())
    85  		if err != nil {
    86  			b.Fatal(err)
    87  		}
    88  		if err := str.Close(); err != nil {
    89  			b.Fatal(err)
    90  		}
    91  	}
    92  }