Skip to content

Display potential build time savings in experiment summaries #274

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public enum Fields {
EXECUTED_NOT_CACHEABLE_DURATION("Executed not cacheable duration", d -> totalDuration(d, "executed_not_cacheable")),
EFFECTIVE_TASK_EXECUTION_DURATION("Effective task execution duration", d -> String.valueOf(d.getEffectiveTaskExecutionDuration().toMillis())),
SERIALIZATION_FACTOR("Serialization factor", d -> formatBigDecimal(d.getSerializationFactor())),
EXECUTED_CACHEABLE_DURATION_MILLISECONDS("Executed cacheable duration milliseconds", d -> totalDurationMillis(d, "executed_cacheable")),
;

public final String label;
Expand Down Expand Up @@ -77,6 +78,15 @@ private static String totalDuration(BuildValidationData data, String avoidanceOu
);
}

private static String totalDurationMillis(BuildValidationData data, String avoidanceOutcome) {
return String.valueOf(
data.getTasksByAvoidanceOutcome()
.getOrDefault(avoidanceOutcome, TaskExecutionSummary.ZERO)
.totalDuration()
.toMillis()
);
}

private static String formatDuration(Duration duration) {
long hours = duration.toHours();
long minutes = duration.minusHours(hours).toMinutes();
Expand Down
7 changes: 6 additions & 1 deletion components/scripts/lib/build-scan-parse.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ executed_not_cacheable_duration=()
# Build duration metrics
effective_task_execution_duration=()
serialization_factors=()
executed_cacheable_duration_milliseconds=()

parse_build_scan_csv() {
# This isn't the most robust way to read a CSV,
Expand All @@ -46,7 +47,7 @@ parse_build_scan_csv() {
idx=0

# shellcheck disable=SC2034 # not all scripts use all of the fetched data
while IFS=, read -r field_1 field_2 field_3 field_4 field_5 field_6 field_7 field_8 field_9 field_10 field_11 field_12 field_13 field_14 field_15 field_16 field_17 field_18 field_19 field_20 field_21; do
while IFS=, read -r field_1 field_2 field_3 field_4 field_5 field_6 field_7 field_8 field_9 field_10 field_11 field_12 field_13 field_14 field_15 field_16 field_17 field_18 field_19 field_20 field_21 field_22; do
if [[ "$header_row_read" == "false" ]]; then
header_row_read=true
continue;
Expand Down Expand Up @@ -86,6 +87,10 @@ parse_build_scan_csv() {
serialization_factors[idx]="${field_21}"
fi

if [[ -n "$field_22" ]]; then
executed_cacheable_duration_milliseconds[idx]="${field_22}"
fi

((idx++))
done <<< "${build_scan_csv}"
}
31 changes: 31 additions & 0 deletions components/scripts/lib/info.sh
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@ print_performance_characteristics() {

print_realized_build_time_savings

print_potential_build_time_savings

print_build_caching_leverage_metrics

print_serialization_factor
Expand Down Expand Up @@ -172,6 +174,35 @@ print_realized_build_time_savings() {
fi
}

print_potential_build_time_savings() {
local build_1_effective_execution_duration="${effective_task_execution_duration[0]}"

local build_2_effective_execution_duration="${effective_task_execution_duration[1]}"
local build_2_executed_cacheable_duration="${executed_cacheable_duration_milliseconds[1]}"
local build_2_serialization_factor="${serialization_factors[1]}"

# Do not print potential build time savings at all if these values do not exist
# This can happen since build-scan-support-tool does not yet support these fields
if [[ -z "${build_1_effective_execution_duration}" || -z "${build_2_effective_execution_duration}" || -z "${build_2_executed_cacheable_duration}" || -z "${build_2_serialization_factor}" ]]; then
return 0
fi

local value
value=""
# Only calculate realized build time savings when these have valid values
# These values can be returned as zero when an error occurs processing the Build Scan data
if [[ "${build_1_effective_execution_duration}" && "${build_2_effective_execution_duration}" && -n "${build_2_serialization_factor}" ]]; then
local first_build second_build potential_build_duration potential_savings
first_build=$(format_duration "${effective_task_execution_duration[0]}")
# shellcheck disable=SC2034 # it's used on the next few lines
potential_build_duration=$(echo "${build_2_effective_execution_duration}-(${build_2_executed_cacheable_duration}/${build_2_serialization_factor})" | bc)
potential_savings=$(format_duration build_1_effective_execution_duration-potential_build_duration)
second_build=$(format_duration potential_build_duration)
value="${potential_savings} wall-clock time (from ${first_build} to ${second_build})"
fi
summary_row "Potential build time savings:" "${value}"
}

print_build_caching_leverage_metrics() {
local task_count_padding
task_count_padding=$(max_length "${avoided_from_cache_num_tasks[1]}" "${executed_cacheable_num_tasks[1]}" "${executed_not_cacheable_num_tasks[1]}")
Expand Down