Skip to content

RestClient.Execute() is extremely slow compared to RestClient.ExecuteAsync().Result #2375

@tyuah8

Description

@tyuah8

Describe the bug
RestClient.Execute() is extremely slow compared to RestClient.ExecuteAsync().Result, when called in a parallel setting, even though both are synchronous.

To Reproduce

private class CustomInterceptor : Interceptor
{
    public override ValueTask BeforeDeserialization ( RestResponse response, CancellationToken cancellationToken )
    {
        response.ContentType = ContentTypes.application_json;
        return ValueTask.CompletedTask;
    }
}

static void Test02 ()
{
    //
    const int total = 100;
    int width = ( int ) Math.Ceiling( Math.Log10( total ) );
    ( int, TimeSpan )[] elapsed = new ( int, TimeSpan )[total];
    //

    RestResponse    Execute    ( RestClient c, string resource, Method method, Action<RestRequest> callback )
    {
        //
        RestRequest     i;
        RestResponse    o;
        //

        if ( c == null )
            throw new ArgumentNullException( nameof( c ) );

        i = new RestRequest( resource, method );
        callback?.Invoke( i );
        i.Interceptors = [];
        i.Interceptors.Add( new CustomInterceptor() );
        o = c.Execute( i );
        return o;
    }

    void Test ( int i )
    {
        //
        Stopwatch watch;
        //

        static void Add ( RestRequest t )
        {
            t.AddHeader( HTTPHeaders.Content_Type, ContentTypes.application_json );
        }

        watch = Stopwatch.StartNew();
        using ( var c = new RestClient( some server ) )
            Execute( c, "", Method.Post, Add );

        watch.Stop();
        elapsed[i] = ( i, watch.Elapsed );
    }

    Parallel.For( 0, total, Test );

    ////

    Array.Sort( elapsed, ( x, y ) => y.Item2.CompareTo( x.Item2 ) );
    for ( int i = 0; i < total; i++ )
        Console.WriteLine( $@"{elapsed[i].Item1.ToString().PadLeft( width )} => {elapsed[i].Item2:mm\:ss\.fff}" );
}

If you use the above code, which uses c.Execute( i ), to communicate to a server, there will be very long delays (up to roughly 10 s). If you replace c.Execute( i ) with c.ExecuteAsync( i ).Result, the time is reduced to just roughly 1 s.

Expected behavior
Since both RestClient.Execute() and RestClient.ExecuteAsync().Result are synchronous, both should have the exact same performance.

Desktop

  • OS: Windows 11
  • .NET 8.0
  • Version 114.0.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions