コード例 #1
0
        // ------------------------------------------------------

        public void Compute(Serializer SelectedSerializer, ObservableCollection <string> Log, string csvTableFileName)
        {
            this.TextBoxState.Text = "Computing... please wait.";
            this.StreamSize.Text   = string.Empty;
            var cursor = this.Cursor;

            this.Cursor = Cursors.Wait;
            DoEvents();

            int itemCount = int.Parse(this.ItemCount.Text);
            int loopCount = int.Parse(this.LoopCount.Text);

            DataDescriptor dataDescriptor = (DataDescriptor)this.Data.SelectedItem;

            object data = dataDescriptor.BuildASampleArray(itemCount);

            long StreamSize = 0;

            bool   inRam    = (StreamManagement)this.StreamManagementChoice.SelectedItem == StreamManagement.SerializeInRAM;
            string fileName = this.FileName.Text;

            {
                if (!inRam && !Directory.Exists(Path.GetDirectoryName(fileName)))
                {
                    MessageBox.Show("The serialization file path does not exist !");
                    return;
                }
                if (csvTableFileName != null && !Directory.Exists(Path.GetDirectoryName(csvTableFileName)))
                {
                    MessageBox.Show("The result table file path does not exist !");
                    return;
                }
            }

            bool ShareTheDeSerializer = this.ShareTheDeSerializer.IsChecked.Value;


            ResourceCounter resourceCounter;

            if (SelectedSerializer != null)
            {                   // Only one serializer will be tested:
                Exception error;
                StreamSize = RunUnitTest(SelectedSerializer, data, dataDescriptor, out resourceCounter, inRam, fileName, ShareTheDeSerializer, loopCount, itemCount, out error);
                if (error != null)
                {
                    MessageBox.Show("ERROR: " + error.Message);
                }
            }
            else             // All serializers will be tested:
            {
                CsvTable csvTable = new CsvTable(TableTitles);

                bool   IsUniversalSerializerBinary = true;
                double usbTime = 0.0, usbSize = 0.0, usbRAM = 0.0;
                foreach (var serInstance in SerializerInstances)
                {
                    Exception error;
                    StreamSize = RunUnitTest(serInstance, data, dataDescriptor, out resourceCounter, inRam, fileName, ShareTheDeSerializer, loopCount, itemCount, out error);

                    if (error == null)
                    {
                        Log.Add(string.Format(
                                    ". Serializer \"{0}\": Time={1} ms; File length={2:f3} Mio; Average item size={3:f1} bytes; GC consumption={4:f1} Mio; Working set consumption={5:f1} Mio.",
                                    serInstance.Name,
                                    resourceCounter.ElapsedTimeInMs,
                                    (((double)StreamSize) / (1024.0 * 1024.0)),
                                    ((double)StreamSize / ((double)itemCount * (ShareTheDeSerializer ? (double)loopCount : 1.0))),
                                    (((double)resourceCounter.GCConsumptionPeak) / (1024.0 * 1024.0)),
                                    (((double)resourceCounter.WorkingSet64ConsumptionPeak) / (1024.0 * 1024.0))
                                    ));
                    }
                    else
                    {
                        Log.Add(string.Format(
                                    ". Serializer \"{0}\": ERROR \"{1}\"",
                                    serInstance.Name,
                                    error.Message.TrimEnd(new char[] { '\n', '\r' }))
                                + (error.InnerException == null ? string.Empty : string.Format(" (inner exception:\"{0}\")", error.InnerException.Message))
                                );
                    }


                    if (IsUniversalSerializerBinary)
                    {
                        usbTime = resourceCounter.ElapsedTimeInMs;
                        usbSize = StreamSize;
                        usbRAM  = resourceCounter.GCConsumptionPeak;
                    }

                    double TimePercent               = IsUniversalSerializerBinary ? 100.0 : resourceCounter.ElapsedTimeInMs * 100.0 / usbTime;
                    double SizePercent               = IsUniversalSerializerBinary ? 100.0 : 100.0 * (double)StreamSize / usbSize;
                    double GCconsumptionPercent      = IsUniversalSerializerBinary ? 100.0 : 100.0 * (double)resourceCounter.GCConsumptionPeak / usbRAM;
                    double ConsumedWorkingSetPercent = IsUniversalSerializerBinary ? 100.0 : 100.0 * (double)resourceCounter.WorkingSet64ConsumptionPeak / usbRAM;
                    double TotalPercent              = IsUniversalSerializerBinary ? 100.0 : (TimePercent + SizePercent + GCconsumptionPercent) / 3.0;

                    csvTable.AddLine(new object[] {
                        serInstance.Name,
                        resourceCounter.ElapsedTimeInMs,
                        StreamSize,
                        ((double)StreamSize / ((double)itemCount * (ShareTheDeSerializer ? (double)loopCount : 1.0))),
                        resourceCounter.GCConsumptionPeak,
                        resourceCounter.WorkingSet64ConsumptionPeak,
                        TimePercent,
                        SizePercent,
                        GCconsumptionPercent,
                        ConsumedWorkingSetPercent,
                        TotalPercent,
                        ((double)itemCount * (double)loopCount * (double)dataDescriptor.IdealStructureSize) / resourceCounter.ElapsedTimeInMs,                              //"Bytes/ms"
                        ((double)itemCount * (ShareTheDeSerializer ? (double)loopCount : 1.0) * (double)dataDescriptor.IdealStructureSize) / (double)StreamSize,            //"Data/file lengths"
                        ((double)itemCount * (double)loopCount * (double)dataDescriptor.IdealStructureSize) / (double)resourceCounter.GCConsumptionPeak,                    //"data bytes/GC memory"
                        ((double)itemCount * (double)loopCount * (double)dataDescriptor.IdealStructureSize) / (double)resourceCounter.WorkingSet64ConsumptionPeak           //"data bytes/Working set"
                    });
                    DoEvents();
                    IsUniversalSerializerBinary = false;
                }

                csvTable.ExportToFile(csvTableFileName);
            }

            this.TextBoxState.Text = "Computation completed";
            this.Cursor            = cursor;
            DoEvents();
        }