v8/v8
0
Files
.github
bazel
build_overrides
custom_deps
docs
gni
include
infra
samples
src
test
testing
third_party
tools
bazel
builtins-pgo
cfi
clusterfuzz
cppgc
debug_helper
dev
explicit-compile-hints
gcmole
generate_shim_headers
heap-layout
heap-stats
js
jsfunfuzz
link_clicker.extension
mb
memory
msan
perf
profiling
profview
release
sanitizers
snapshot
system-analyzer
testrunner
toolchain
torque
tracing
turbolizer
ubsan
unittests
v8windbg
valgrind
vim
visual_studio
wasm
wasm-compilation-hints
zone-stats
.vpython3
BUILD.gn
DEPS
Makefile.tags
OWNERS
PRESUBMIT.py
README.md
__init__.py
adb-d8.py
android-build.sh
android-run.py
android-sync.sh
arguments.mjs
avg.py
bash-completion.sh
bigint-tester.py
callstats-from-telemetry.sh
callstats.html
callstats.py
callstats_groups.py
check-inline-includes.sh
check-static-initializers.sh
check-unused-bailouts.sh
check-unused-symbols.sh
codemap.mjs
collect_deprecation_stats.sh
compare-table-gen.js
compare_torque_output.py
consarray.mjs
cpu.sh
cross_build_gcc.sh
csvparser.mjs
detect-builtins.js
disasm.py
draw_instruction_graph.sh
dump-cpp.py
dumpcpp-driver.mjs
dumpcpp.mjs
eval_gc_nvp.py
eval_gc_time.sh
find-builtin
find-commit-for-patch.py
find_depot_tools.py
freebsd-tick-processor
fuzz-harness.sh
gc-nvp-to-csv.py
gc-nvp-trace-processor.py
gc_nvp_common.py
gdb-v8-support.py
gdbinit
gen-inlining-tests.py
gen-keywords-gen-h.py
gen-postmortem-metadata.py
gen-v8-gn.py
generate-builtins-tests.py
generate-header-include-checks.py
generate-runtime-call-stats.py
generate-ten-powers.scm
get_landmines.py
grokdump.py
heap-snapshot-processor.py
ic-processor
ic-processor-driver.mjs
index.html
linux-tick-processor
lldb_commands.py
lldb_visualizers.py
locs.py
logreader.mjs
mac-nm
mac-tick-processor
objdump-v8
package-lock.json
package.json
parse-processor
parse-processor-driver.mjs
parse-processor.html
parse-processor.mjs
perf-compare.py
predictable_wrapper.py
process-wasm-compilation-times.py
profile.mjs
profile_view.js
profile_view.mjs
regexp-sequences.py
run-clang-tidy.py
run-num-fuzzer.py
run-tests.py
run-wasm-api-tests.py
run.py
run_perf.py
shell-utils.h
sourcemap.mjs
splaytree.mjs
stats-viewer.py
test262-results-parser.js
tickprocessor-driver.mjs
tickprocessor.mjs
try_perf.py
turbolizer-perf.py
update-object-macros-undef.py
v8_presubmit.py
whitespace.txt
windbg.js
windows-tick-processor.bat
wpr.wprp
.bazelrc
.clang-format
.clang-tidy
.editorconfig
.flake8
.git-blame-ignore-revs
.gitattributes
.gitignore
.gn
.mailmap
.style.yapf
.vpython3
.ycm_extra_conf.py
AUTHORS
BUILD.bazel
BUILD.gn
CODE_OF_CONDUCT.md
COMMON_OWNERS
DEPS
DIR_METADATA
ENG_REVIEW_OWNERS
INFRA_OWNERS
INTL_OWNERS
LICENSE
LICENSE.fdlibm
LICENSE.strongtalk
LICENSE.v8
LOONG_OWNERS
MIPS_OWNERS
OWNERS
PPC_OWNERS
PRESUBMIT.py
README.md
RISCV_OWNERS
S390_OWNERS
WATCHLISTS
WORKSPACE
codereview.settings
v8/tools/dumpcpp.mjs
Camillo Bruni 190af788af [tools][system-analyzer] Speed up log parsing
Reduce the dispatching overhead in the hottest loop when parsing log-lines.

- Using a JSMap we can avoid internalizing strings
- Preprocess the dispatch table and only have varArgs or functions as
  parsers
- string[] seems to be slightly faster than string.charAt()

Bug: v8:10644
Change-Id: I03b13bdeecda1ad037191ff74e05142ceeb6533c
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3571890
Reviewed-by: Patrick Thier <pthier@chromium.org>
Commit-Queue: Camillo Bruni <cbruni@chromium.org>
Cr-Commit-Position: refs/heads/main@{#79816}
2022-04-06 11:31:03 +00:00

69 lines
2.1 KiB
JavaScript

// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import { LogReader, parseString } from "./logreader.mjs";
import { CodeMap, CodeEntry } from "./codemap.mjs";
export {
ArgumentsProcessor, LinuxCppEntriesProvider,
WindowsCppEntriesProvider, MacOSCppEntriesProvider,
} from "./tickprocessor.mjs";
export class CppProcessor extends LogReader {
constructor(cppEntriesProvider, timedRange, pairwiseTimedRange) {
super(timedRange, pairwiseTimedRange);
this.setDispatchTable({
__proto__: null,
'shared-library': {
parsers: [parseString, parseInt, parseInt, parseInt],
processor: this.processSharedLibrary }
});
this.cppEntriesProvider_ = cppEntriesProvider;
this.codeMap_ = new CodeMap();
this.lastLogFileName_ = null;
}
/**
* @override
*/
printError(str) {
console.log(str);
}
processLogFile(fileName) {
this.lastLogFileName_ = fileName;
let line;
while (line = readline()) {
this.processLogLine(line);
}
}
processLogFileInTest(fileName) {
// Hack file name to avoid dealing with platform specifics.
this.lastLogFileName_ = 'v8.log';
const contents = d8.file.read(fileName);
this.processLogChunk(contents);
}
processSharedLibrary(name, startAddr, endAddr, aslrSlide) {
const self = this;
const libFuncs = this.cppEntriesProvider_.parseVmSymbols(
name, startAddr, endAddr, aslrSlide, function(fName, fStart, fEnd) {
const entry = new CodeEntry(fEnd - fStart, fName, 'CPP');
self.codeMap_.addStaticCode(fStart, entry);
});
}
dumpCppSymbols() {
const staticEntries = this.codeMap_.getAllStaticEntriesWithAddresses();
const total = staticEntries.length;
for (let i = 0; i < total; ++i) {
const entry = staticEntries[i];
const printValues = ['cpp', `0x${entry[0].toString(16)}`, entry[1].size,
`"${entry[1].name}"`];
console.log(printValues.join(','));
}
}
}