/
runtimeExecutionTimes.ts
107 lines (95 loc) · 4 KB
/
runtimeExecutionTimes.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import QueryMetricsConstants from "./queryMetricsConstants";
import { parseDelimitedString, timeSpanFromMetrics } from "./queryMetricsUtils";
import { TimeSpan } from "./timeSpan";
export class RuntimeExecutionTimes {
constructor(
public readonly queryEngineExecutionTime: TimeSpan,
public readonly systemFunctionExecutionTime: TimeSpan,
public readonly userDefinedFunctionExecutionTime: TimeSpan
) {}
/**
* returns a new RuntimeExecutionTimes instance that is the addition of this and the arguments.
*/
public add(...runtimeExecutionTimesArray: RuntimeExecutionTimes[]) {
let queryEngineExecutionTime = this.queryEngineExecutionTime;
let systemFunctionExecutionTime = this.systemFunctionExecutionTime;
let userDefinedFunctionExecutionTime = this.userDefinedFunctionExecutionTime;
for (const runtimeExecutionTimes of runtimeExecutionTimesArray) {
if (runtimeExecutionTimes == null) {
throw new Error("runtimeExecutionTimes has null or undefined item(s)");
}
queryEngineExecutionTime = queryEngineExecutionTime.add(
runtimeExecutionTimes.queryEngineExecutionTime
);
systemFunctionExecutionTime = systemFunctionExecutionTime.add(
runtimeExecutionTimes.systemFunctionExecutionTime
);
userDefinedFunctionExecutionTime = userDefinedFunctionExecutionTime.add(
runtimeExecutionTimes.userDefinedFunctionExecutionTime
);
}
return new RuntimeExecutionTimes(
queryEngineExecutionTime,
systemFunctionExecutionTime,
userDefinedFunctionExecutionTime
);
}
/**
* Output the RuntimeExecutionTimes as a delimited string.
*/
public toDelimitedString() {
// tslint:disable-next-line:max-line-length
return (
`${
QueryMetricsConstants.SystemFunctionExecuteTimeInMs
}=${this.systemFunctionExecutionTime.totalMilliseconds()};` +
// tslint:disable-next-line:max-line-length
`${
QueryMetricsConstants.UserDefinedFunctionExecutionTimeInMs
}=${this.userDefinedFunctionExecutionTime.totalMilliseconds()}`
);
}
public static readonly zero = new RuntimeExecutionTimes(
TimeSpan.zero,
TimeSpan.zero,
TimeSpan.zero
);
/**
* Returns a new instance of the RuntimeExecutionTimes class that is
* the aggregation of an array of RuntimeExecutionTimes.
*/
public static createFromArray(runtimeExecutionTimesArray: RuntimeExecutionTimes[]) {
if (runtimeExecutionTimesArray == null) {
throw new Error("runtimeExecutionTimesArray is null or undefined item(s)");
}
return RuntimeExecutionTimes.zero.add(...runtimeExecutionTimesArray);
}
/**
* Returns a new instance of the RuntimeExecutionTimes class this is deserialized from a delimited string.
*/
public static createFromDelimitedString(delimitedString: string) {
const metrics = parseDelimitedString(delimitedString);
const vmExecutionTime = timeSpanFromMetrics(metrics, QueryMetricsConstants.VMExecutionTimeInMs);
const indexLookupTime = timeSpanFromMetrics(metrics, QueryMetricsConstants.IndexLookupTimeInMs);
const documentLoadTime = timeSpanFromMetrics(
metrics,
QueryMetricsConstants.DocumentLoadTimeInMs
);
const documentWriteTime = timeSpanFromMetrics(
metrics,
QueryMetricsConstants.DocumentWriteTimeInMs
);
let queryEngineExecutionTime = TimeSpan.zero;
queryEngineExecutionTime = queryEngineExecutionTime.add(vmExecutionTime);
queryEngineExecutionTime = queryEngineExecutionTime.subtract(indexLookupTime);
queryEngineExecutionTime = queryEngineExecutionTime.subtract(documentLoadTime);
queryEngineExecutionTime = queryEngineExecutionTime.subtract(documentWriteTime);
return new RuntimeExecutionTimes(
queryEngineExecutionTime,
timeSpanFromMetrics(metrics, QueryMetricsConstants.SystemFunctionExecuteTimeInMs),
timeSpanFromMetrics(metrics, QueryMetricsConstants.UserDefinedFunctionExecutionTimeInMs)
);
}
}