public void Setup()
        {
            allocator       = new BufferAllocator();
            context         = new ParseTdhContext();
            formatProvider  = CultureInfo.InvariantCulture;
            nativeFormatter = new NativeTdhFormatter();

            var record = new EventRecordBuilder(allocator);

            record.AddArg(32);

            var info = new TraceEventInfoBuilder(allocator);

            info.EventMessage          = "Foo %1 Bar";
            info.PropertyCount         = 1;
            info.TopLevelPropertyCount = 1;
            info.EventPropertyInfos    = new[] {
                new EVENT_PROPERTY_INFO {
                    InType  = TDH_IN_TYPE.INT32,
                    OutType = TDH_OUT_TYPE.INT,
                    countAndCountPropertyIndex   = 1,
                    lengthAndLengthPropertyIndex = 4
                }
            };

            recordPtr = record.Build();
            infoPtr   = info.Build();
        }
        public unsafe void GetMessageForEventRecord()
        {
            var allocator = new BufferAllocator();

            var record = new EventRecordBuilder(allocator);

            record.AddArg(32);
            var recordPtr = record.Build();

            var info = new TraceEventInfoBuilder(allocator);

            info.EventMessage          = "Foo %1 Bar";
            info.PropertyCount         = 1;
            info.TopLevelPropertyCount = 1;
            info.EventPropertyInfos    = new[] {
                new EVENT_PROPERTY_INFO {
                    InType  = TDH_IN_TYPE.INT32,
                    OutType = TDH_OUT_TYPE.INT,
                    countAndCountPropertyIndex   = 1,
                    lengthAndLengthPropertyIndex = 4
                }
            };
            var infoPtr = info.Build();

            var    context        = new ParseTdhContext();
            var    formatProvider = CultureInfo.InvariantCulture;
            string message;

            var sw = new Stopwatch();

            var formatter = new NativeTdhFormatter();

            sw.Restart();
            for (int i = 0; i < 100000; ++i)
            {
                var eventInfo = new EventInfo {
                    EventRecord        = (IntPtr)recordPtr.Ptr,
                    TraceEventInfo     = (IntPtr)infoPtr.Ptr,
                    TraceEventInfoSize = (UIntPtr)infoPtr.Size
                };
                message = formatter.GetMessageForEvent(
                    eventInfo, context, formatProvider);
                Assert.Equal("Foo 32 Bar", message);
            }
            sw.Stop();
            output.WriteLine("EMF: {0}", sw.ElapsedMilliseconds);

            allocator.Dispose();
        }