// ------------------------------------------------------ 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(); }