Table of Contents

Performance

Production

The speed ultimately is determined by

  • how fast you can prepare the messages
  • network bandwidth
  • performance on the remote side (SMPP Server)
  • how fast you can process responses

On good tuned production systems you can reach 500 messages/seconds.

Tuning

You can try to play with following optimization parameters:

Change number of threads that process received messages. Dafault is 3

client.WorkerThreads = 10;

Change receive or send buffer size for client socket

client.ReceiveBufferSize = 32 * 1024 * 1024;
client.SendBufferSize = 32 * 1024 * 1024; 

You can also monitor queue state for the client:

client.Queue.ReceiveCount;
client.Queue.SendCount;

Local Test

Inetlab.SMPP performance on local machine with disabled logging shows following results

Sync performance: 8764 m/s
Async performance: 13252 m/s 

Following code demonstrate this

class Program
{
    static void Main(string[] args)
    {
        Program p = new Program();

       Console.WriteLine("Sync performance: "+p.RunSyncTest() +" m/s");
       Console.WriteLine("Async performance: " + p.RunAsyncTest() + " m/s");
    }

    readonly SmppServer _server = new SmppServer();
    readonly SmppClient _client = new SmppClient();

    public int RunSyncTest()
    {
        ManualResetEvent start = new ManualResetEvent(false);
        _server.evServerStarted += (sender, args) => start.Set();
        _server.StartAsync(5656);

        start.WaitOne(2000);

        _client.Connect("localhost", 5656);
        _client.Bind("1", "2");
        Stopwatch watch = new Stopwatch();
        watch.Start();

        const int messagesNumber = 20000;
        for (int i = 0; i < messagesNumber; i++)
        {
            var resp = _client.Submit(SMS.ForSubmit().From("111").To("222").Text("test"));
        }

        int result = Convert.ToInt32(messagesNumber / watch.Elapsed.TotalSeconds);

        _client.UnBind();
        _client.Disconnect();
        _server.Stop();

        return result;
    }


    public int RunAsyncTest()
    {
        ManualResetEvent start = new ManualResetEvent(false);
        _server.evServerStarted += (sender, args) => start.Set();
        _server.StartAsync(5656);

        start.WaitOne(2000);

        _client.Connect("localhost", 5656);
        _client.Bind("1", "2");
        _client.evSubmitComplete += (sender, data) => { };




        const int messagesNumber = 20000;


        object sync = new object();
        ManualResetEvent completed = new ManualResetEvent(false);
        long transfered = 0;

        _client.evSubmitComplete += delegate(object sender, SubmitSmResp data)
        {
            lock (sync)
            {
                transfered++;
                if (transfered == messagesNumber)
                {
                    completed.Set();
                }
            }

        };

        Stopwatch watch = new Stopwatch();
        watch.Start();

        for (int i = 0; i < messagesNumber; i++)
        {
            _client.SubmitAsync(SMS.ForSubmit().Text("test " + i).From("1111").To("22222"));
        }


        completed.WaitOne(120000);

        int result = Convert.ToInt32(messagesNumber / watch.Elapsed.TotalSeconds);

        _client.UnBind();
        _client.Disconnect();
        _server.Stop();

        return result;
    }
}