Skip to content

First call to MessagePackSerializer.Get takes several hundred milliseconds #318

Description

@marcbarry

In agreement with the previous comment, when I serialise a simple class

public class Person
{
    public string Name { get; set; }
}

The initial call to MessagePackSerializer.Get takes several hundred milliseconds (somewhere between 350ms to 400ms) and the first call to MessagePackSerializer.Unpack() takes a further 30ms~ or so.

Subsequent calls to both MessagePackSerializer.Pack() and MessagePackSerializer.Unpack() are fast.

The delay only seems to happen when the program first runs. I assume this behaviour is by-design, but is there a way to work around, or at least reduce the "slow start" behaviour?

Tested on MSgPack.Cli v1.0.0 targeting .NET Framework 4.5.

Code to reproduce:

using System;
using System.Diagnostics;
using System.IO;
using MsgPack.Serialization;

namespace ConsoleApp1
{
    public static class Program
    {
        static void Main()
        {
            Sw.Start();

            Console.WriteLine($"{Sw.ElapsedMilliseconds}ms");

            // create serializer
            var serializer = MessagePackSerializer.Get<Person>();

            Console.WriteLine($"{Sw.ElapsedMilliseconds}ms");

            for (var i = 0; i < 5; i++)
            {
                var msgpack = Serialise(serializer, new Person { Name = "Bob" });
                var person = Deserialise(serializer, msgpack);

                Console.WriteLine($"{Sw.ElapsedMilliseconds}ms {person.Name}");
            }

            Console.ReadLine();
        }

        static byte[] Serialise(MessagePackSerializer serializer, Person person)
        {
            using (var stream = new MemoryStream())
            {
                serializer.Pack(stream, person);
                return stream.ToArray();
            }
        }

        static Person Deserialise(MessagePackSerializer serializer, byte[] packedBytes)
        {
            using (var stream = new MemoryStream(packedBytes))
            {
                return (Person) serializer.Unpack(stream);
            }
        }

        static readonly Stopwatch Sw = new Stopwatch();
    }

    public class Person
    {
        public string Name { get; set; }
    }
}

Example output:

0ms           <- application starts, executes MessagePackSerializer.Get<Person>()
341ms         <- MessagePackSerializer.Get() returns after 341ms
374ms Bob     <- First call to MessagePackSerializer.Pack() has a slight delay
374ms Bob     <- Subsequent calls to MessagePackSerializer.Pack() complete quickly.
374ms Bob
374ms Bob
374ms Bob

Is there anything I can do to reduce this initial time calls to MessagePackSerializer.Get() take?

See also #191

Thanks!

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions