1 // Copyright 2001-2019 Crytek GmbH / Crytek Group. All rights reserved.
4 using System
.Collections
.Generic
;
7 using System
.ComponentModel
;
13 private TimeSpan m_min
;
14 private TimeSpan m_max
;
26 public BucketTimeRange(TimeSpan min
, TimeSpan max
)
33 class StreamingTimeBucket
: Bucket
35 [Description("Count")]
39 set { m_num = value; }
45 get { return m_numPc; }
46 set { m_numPc = value; }
49 [Description("% Cumulative")]
50 public float NumPcCumulative
52 get { return m_numPcCumulative; }
53 set { m_numPcCumulative = value; }
56 public StreamingTimeBucket(string rangeStr
)
62 private float m_numPc
;
63 private float m_numPcCumulative
;
66 class StreamingTypeBucket
: Bucket
68 [Description("Count")]
72 set { m_num = value; }
78 get { return m_numPc; }
79 set { m_numPc = value; }
82 public StreamingTypeBucket(string rangeStr
)
88 private float m_numPc
;
91 class StreamingTypeBucketSet
: BucketSet
93 private readonly StreamTaskType
[] m_types
;
94 private readonly Dictionary
<StreamTaskType
, int> m_typeToBucket
= new Dictionary
<StreamTaskType
, int>();
97 public override bool IsEmpty
99 get { return m_total == 0; }
102 public StreamingTypeBucketSet(StreamTaskType
[] types
)
103 : base(CreateBuckets(types
))
107 for (int i
= 0, c
= types
.Length
; i
!= c
; ++i
)
108 m_typeToBucket
[types
[i
]] = i
;
111 public void AddInterval(StreamingInterval iv
)
115 int bucketIdx
= m_typeToBucket
[iv
.Source
];
116 StreamingTypeBucket bucket
= m_buckets
[bucketIdx
] as StreamingTypeBucket
;
122 private void UpdatePc()
124 float total
= m_total
;
125 for (int i
= 0; i
< m_buckets
.Count
; ++i
)
127 StreamingTypeBucket bucket
= m_buckets
[i
] as StreamingTypeBucket
;
128 bucket
.NumPc
= Math
.Min(100.0f
, 100.0f
* bucket
.Num
/ total
);
132 private static List
<Bucket
> CreateBuckets(StreamTaskType
[] types
)
134 List
<Bucket
> l
= new List
<Bucket
>(types
.Length
);
136 foreach (StreamTaskType i
in types
)
137 l
.Add(new StreamingTypeBucket(i
.ToString()));
143 class StreamingTimeBucketSet
: BucketSet
145 private readonly BucketTimeRange
[] m_ranges
;
148 public override bool IsEmpty
150 get { return m_total == 0; }
153 public StreamingTimeBucketSet(BucketTimeRange
[] ranges
)
154 : base(CreateBuckets(ranges
))
160 public void AddIntervals(IEnumerable
<StreamingInterval
> ivs
)
162 foreach (StreamingInterval iv
in ivs
)
163 AddInterval(iv
.Length
);
166 public void AddInterval(double length
)
170 TimeSpan ivts
= new TimeSpan((long)(length
* 1000.0 * 1000.0 * 10.0));
171 int bucketIdx
= m_ranges
.MappedBinarySearchIndex(ivts
, (x
) => x
.Min
, (a
, b
) => a
< b
);
172 StreamingTimeBucket bucket
= (StreamingTimeBucket
)m_buckets
[bucketIdx
];
175 bucket
.NumPc
= Math
.Min(100.0f
, 100.0f
* (bucket
.Num
/ (float)m_total
));
180 private void UpdatePc()
182 float total
= (float)m_total
;
183 int numCumulative
= 0;
185 for (int i
= 0, c
= m_buckets
.Count
; i
< c
; ++i
)
187 StreamingTimeBucket sb
= m_buckets
[i
] as StreamingTimeBucket
;
188 numCumulative
+= sb
.Num
;
189 sb
.NumPc
= Math
.Min(100.0f
, 100.0f
* sb
.Num
/ total
);
190 sb
.NumPcCumulative
= Math
.Min(100.0f
, 100.0f
* (numCumulative
/ total
));
194 static private List
<Bucket
> CreateBuckets(BucketTimeRange
[] ranges
)
196 List
<Bucket
> buckets
= new List
<Bucket
>();
197 foreach (BucketTimeRange r
in ranges
)
200 if (r
.Min
> new TimeSpan(0))
201 s
+= string.Format("{0}ms", r
.Min
.TotalMilliseconds
);
203 if (r
.Max
< TimeSpan
.MaxValue
)
204 s
+= string.Format("{0}ms", r
.Max
.TotalMilliseconds
);
205 buckets
.Add(new StreamingTimeBucket(s
));