public DurationMeasurement(IoMeterBuffer parent, IoMetrics.MeterType type, long size) { Parent = parent; _type = type; Size = size; _start = DateTime.UtcNow; }
public DurationMeasurement(IoMeterBuffer parent, IoMetrics.MeterType type, long size, long fileSize, Action <MeterItem> onFileChange) { Parent = parent; Type = type; Size = size; FileSize = fileSize; Start = DateTime.UtcNow; End = default(DateTime); OnFileChange = onFileChange; CompressedSize = 0; Acceleration = 1; }
internal void Mark(long size, DateTime start, DateTime end, IoMetrics.MeterType type) { var meterItem = new MeterItem { Start = start, Size = size, Type = type, End = end }; var pos = Interlocked.Increment(ref _bufferPos); var adjustedTail = pos % _buffer.Length; if (Interlocked.CompareExchange(ref _buffer[adjustedTail], meterItem, null) == null) { return; } var newSummary = new SummerizedItem { TotalTimeStart = meterItem.Start, TotalTimeEnd = meterItem.End, Count = 1, MaxTime = meterItem.Duration, MinTime = meterItem.Duration, TotalTime = meterItem.Duration, TotalSize = meterItem.Size, Type = meterItem.Type }; for (int i = 0; i < _buffer.Length; i++) { var oldVal = Interlocked.Exchange(ref _buffer[(adjustedTail + i) % _buffer.Length], null); if (oldVal != null) { newSummary.TotalTimeStart = newSummary.TotalTimeStart > oldVal.Start ? oldVal.Start : newSummary.TotalTimeStart; newSummary.TotalTimeEnd = newSummary.TotalTimeEnd > oldVal.End ? newSummary.TotalTimeEnd : oldVal.End; newSummary.Count++; newSummary.MaxTime = newSummary.MaxTime > oldVal.Duration ? newSummary.MaxTime : oldVal.Duration; newSummary.MinTime = newSummary.MinTime > oldVal.Duration ? oldVal.Duration : newSummary.MinTime; newSummary.TotalSize += oldVal.Size; newSummary.TotalTime += oldVal.Duration; } } var increment = Interlocked.Increment(ref _summerizedPos); _summerizedBuffer[increment % _summerizedBuffer.Length] = newSummary; }