Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IJsonWriter / IJsonReader interfaces #7

Closed
dimzon opened this issue Aug 26, 2014 · 2 comments
Closed

IJsonWriter / IJsonReader interfaces #7

dimzon opened this issue Aug 26, 2014 · 2 comments
Labels

Comments

@dimzon
Copy link

dimzon commented Aug 26, 2014

I propose to move whole formatting/parsing logic to separate API. Something like:

public interface IJsonWriter {
    void WriteValue(byte value);
    void WriteValue(sbyte value);
    // etc
    void WriteValue(long value);
    void WriteValue(ulong value);
    void WriteValue(DateTime value);
    void WriteValue(TimeStamp value);
    void WriteValue(byte[] value);
    //etc
    void WriteValue(String value);
    void WriteNull();
    void WriteStartArray(int itemsCount);
    void WriteEndArray(int itemsCount);
    void WriteSeparator(); // ',' for arrays and maps
    void WriteStartMap(int itemsCount);
    void WriteEndMap(int itemsCount);
    void WriteMapKey(String key);
}

this re-factoring allows custom implementation to support MsgPack|CBOR|BSON|UBSON|Smile|RISON etc...

@rpgmaker
Copy link
Owner

I will not be implementing this at this time. The focus of the project is performance and not compatibility with other serialization library. Anything that require not been able to inline as much as possible or calling virtual calls through interface would not work for me at this time.

If fork this project, then i can help contribute a possible solution to the fork.

@dimzon
Copy link
Author

dimzon commented Sep 2, 2014

this is my POC version (no parsing, JsonWriter only): https://gist.github.com/dimzon/37aaf808409df1172da7
benchmark it yourself - there are very little perfomance loss (less than 10%) but more control/flexibility

using System;
using System.Diagnostics;

namespace bench
{
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public DateTime BurthDay { get; set; }
        public string[] Certificates { get; set; }
    }
    class Program
    {

        static void Main(string[] args)
        {
            var obj = new Person {Name = "dimzon", Age = 36, BurthDay = new DateTime(1978, 11, 27, 22, 11, 0), Certificates = new []{"MCPD:EAD","MCTS:MSSQL"}};
            //warmup
            for (var i = 0; i < 1000000; ++i)
            {
                NetJSON.NetJSON.Serialize(obj);
                DimzonNetJSON.DimzonNetJSON.Serialize(obj);
            }


            const int count = 2000000;
            var tw = new Stopwatch();


            for (var j = 0; j < 10; ++j)
            {
                tw.Restart();
                for (int i = 0; i < count; ++i)
                {
                    DimzonNetJSON.DimzonNetJSON.Serialize(obj);
                }
                tw.Stop();
                Console.WriteLine("D " + tw.Elapsed);

                tw.Restart();
                for (int i = 0; i < count; ++i)
                {
                    NetJSON.NetJSON.Serialize(obj);
                }
                tw.Stop();
                Console.WriteLine("O " + tw.Elapsed);
            }
        }
    }
}

output:

D 00:00:01.5138228
O 00:00:01.6044580
D 00:00:01.6135190
O 00:00:01.4975824
D 00:00:01.5947025
O 00:00:01.5274662
D 00:00:01.6073275
O 00:00:01.4749211
D 00:00:01.5504076
O 00:00:01.4883129
D 00:00:01.5398498
O 00:00:01.5253677
D 00:00:01.5886444
O 00:00:01.4451989
D 00:00:01.5432052
O 00:00:01.4504755
D 00:00:01.5747841
O 00:00:01.5088011
D 00:00:01.5792748
O 00:00:01.4611339

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants