blob: 7270fae86ba4cb771f926fef197f3f39576ff183 [file] [log] [blame]
// Copyright 2015 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.devtools.build.lib.profiler.statistics;
import com.google.devtools.build.lib.profiler.ProfilePhase;
import com.google.devtools.build.lib.profiler.analysis.ProfileInfo;
import com.google.devtools.build.lib.profiler.analysis.ProfileInfo.InfoListener;
import com.google.devtools.build.lib.vfs.Path;
import java.io.IOException;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* Builds and aggregates statistics for multiple profile files.
*/
public final class MultiProfileStatistics implements Iterable<Path> {
private final PhaseSummaryStatistics summaryStatistics;
private final EnumMap<ProfilePhase, PhaseStatistics> summaryPhaseStatistics;
private final Map<Path, EnumMap<ProfilePhase, PhaseStatistics>> filePhaseStatistics;
private final SkylarkStatistics skylarkStatistics;
private int missingActionsCount;
private boolean generateVfsStatistics;
public MultiProfileStatistics(
Path workingDirectory,
String workSpaceName,
List<String> files,
InfoListener listener,
boolean generateVfsStatistics) {
summaryStatistics = new PhaseSummaryStatistics();
summaryPhaseStatistics = new EnumMap<>(ProfilePhase.class);
filePhaseStatistics = new HashMap<>();
skylarkStatistics = new SkylarkStatistics();
this.generateVfsStatistics = generateVfsStatistics;
for (String file : files) {
loadProfileFile(workingDirectory, workSpaceName, file, listener);
}
}
public PhaseSummaryStatistics getSummaryStatistics() {
return summaryStatistics;
}
public EnumMap<ProfilePhase, PhaseStatistics> getSummaryPhaseStatistics() {
return summaryPhaseStatistics;
}
public PhaseStatistics getSummaryPhaseStatistics(ProfilePhase phase) {
return summaryPhaseStatistics.get(phase);
}
public SkylarkStatistics getSkylarkStatistics() {
return skylarkStatistics;
}
public int getMissingActionsCount() {
return missingActionsCount;
}
public EnumMap<ProfilePhase, PhaseStatistics> getPhaseStatistics(Path file) {
return filePhaseStatistics.get(file);
}
@Override
public Iterator<Path> iterator() {
return filePhaseStatistics.keySet().iterator();
}
/**
* Loads a single profile file and adds the statistics to the previously collected ones.
*/
private void loadProfileFile(
Path workingDirectory, String workSpaceName, String file, InfoListener listener) {
ProfileInfo info;
Path profileFile = workingDirectory.getRelative(file);
try {
info = ProfileInfo.loadProfileVerbosely(profileFile, listener);
ProfileInfo.aggregateProfile(info, listener);
} catch (IOException e) {
listener.warn("Ignoring file " + file + " - cannot load: " + e.getMessage());
return;
}
summaryStatistics.addProfileInfo(info);
EnumMap<ProfilePhase, PhaseStatistics> fileStatistics = new EnumMap<>(ProfilePhase.class);
filePhaseStatistics.put(profileFile, fileStatistics);
for (ProfilePhase phase : ProfilePhase.values()) {
PhaseStatistics filePhaseStat =
new PhaseStatistics(phase, info, workSpaceName, generateVfsStatistics);
fileStatistics.put(phase, filePhaseStat);
PhaseStatistics summaryPhaseStats;
if (summaryPhaseStatistics.containsKey(phase)) {
summaryPhaseStats = summaryPhaseStatistics.get(phase);
} else {
summaryPhaseStats = new PhaseStatistics(phase, generateVfsStatistics);
summaryPhaseStatistics.put(phase, summaryPhaseStats);
}
summaryPhaseStats.add(filePhaseStat);
}
skylarkStatistics.addProfileInfo(info);
missingActionsCount += info.getMissingActionsCount();
}
}