public PerformanceReport(PerformanceSnapshot firstSnapshot, PerformanceSnapshot secondSnapshot) { var sn2Index = secondSnapshot.ProcessList.Where(x => x.ProcessId != 0).ToDictionary(x => x.ProcessId); var reports = new List <ProcessReport>(); foreach (var p1 in firstSnapshot.ProcessList) { if (!sn2Index.ContainsKey(p1.ProcessId)) { continue; } var p2 = sn2Index[p1.ProcessId]; var cpuUsage = (p2.PercentProcessorTime - p1.PercentProcessorTime) / (double)(p2.Timestamp - p1.Timestamp) / Environment.ProcessorCount * 100.0; var sd = new ProcessReport(); sd.ProcessId = p2.ProcessId; sd.Name = p2.ProcessName; sd.PercentProcessorTime = cpuUsage; reports.Add(sd); } ProcessList = reports; }
private void Measure() { var connection = new SQLiteConnection("Data Source=" + DbFile); connection.Open(); try { using (var transaction = connection.BeginTransaction()) { var cmd = new SQLiteCommand(connection); cmd.CommandText = "INSERT INTO Measurements (TimeStamp) VALUES (@TimeStamp)"; cmd.Parameters.AddWithValue("@TimeStamp", DateTime.Now); cmd.ExecuteNonQuery(); var measurementId = connection.LastInsertRowId; var snapshot1 = new PerformanceSnapshot(); Thread.Sleep(1000); var snapshot2 = new PerformanceSnapshot(); var report = new PerformanceReport(snapshot1, snapshot2); foreach (var process in report.ProcessList) { cmd = new SQLiteCommand(connection); cmd.CommandText = "INSERT INTO ProcessDetails (MeasurementId, ProcessId, ProcessName, ProcessorTime) VALUES (@MeasurementId, @ProcessId, @ProcessName, @ProcessorTime)"; cmd.Parameters.AddWithValue("@MeasurementId", measurementId); cmd.Parameters.AddWithValue("@ProcessId", process.ProcessId); cmd.Parameters.AddWithValue("@ProcessName", process.Name); cmd.Parameters.AddWithValue("@ProcessorTime", process.PercentProcessorTime); cmd.ExecuteNonQuery(); RecordCount++; } MeasurementCount++; transaction.Commit(); } } finally { connection.Close(); connection.Dispose(); } FileSize = new FileInfo(DbFile).Length; }