aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvelina Dumitrescu <evelinad@google.com>2016-08-23 23:12:13 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-02-01 18:13:42 -0800
commitd8b488f9b1038b02ce98f2784134a7c31c772e87 (patch)
treee43e403166f9d3bd7e8a76b2d04f30bab1d82690
parent9b33372c45fb525383a4e1e5cbb06904e5fb4c60 (diff)
downloadtoolchain-utils-d8b488f9b1038b02ce98f2784134a7c31c772e87.tar.gz
user_activity_benchmarks: Added unit tests for the process_hot_functions
module. BUG=None TEST=None Change-Id: I41fb0cd89e108f96cc061bf3ac72403a7108b30b Reviewed-on: https://chrome-internal-review.googlesource.com/279955 Commit-Queue: Evelina Dumitrescu <evelinad@google.com> Tested-by: Evelina Dumitrescu <evelinad@google.com> Reviewed-by: George Burgess <gbiv@google.com> Reviewed-by: Luis Lozano <llozano@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/435456 Commit-Ready: Luis Lozano <llozano@chromium.org> Tested-by: Luis Lozano <llozano@chromium.org>
-rwxr-xr-xuser_activity_benchmarks/process_hot_functions_unittest.py134
-rw-r--r--user_activity_benchmarks/testdata/expected/pprof_common/file1.pprof3
-rw-r--r--user_activity_benchmarks/testdata/expected/pprof_common/file2.pprof2
-rw-r--r--user_activity_benchmarks/testdata/expected/pprof_common/file3.pprof4
-rw-r--r--user_activity_benchmarks/testdata/input/cwp_functions_file.csv38
-rw-r--r--user_activity_benchmarks/testdata/input/parse_cwp_statistics.csv6
-rw-r--r--user_activity_benchmarks/testdata/input/pprof/file1.pprof20
-rw-r--r--user_activity_benchmarks/testdata/input/pprof/file2.pprof17
-rw-r--r--user_activity_benchmarks/testdata/input/pprof/file3.pprof21
-rw-r--r--user_activity_benchmarks/testdata/results/pprof_common/file1.pprof3
-rw-r--r--user_activity_benchmarks/testdata/results/pprof_common/file2.pprof2
-rw-r--r--user_activity_benchmarks/testdata/results/pprof_common/file3.pprof4
12 files changed, 254 insertions, 0 deletions
diff --git a/user_activity_benchmarks/process_hot_functions_unittest.py b/user_activity_benchmarks/process_hot_functions_unittest.py
new file mode 100755
index 00000000..b0a633cf
--- /dev/null
+++ b/user_activity_benchmarks/process_hot_functions_unittest.py
@@ -0,0 +1,134 @@
+#!/usr/bin/python2
+
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Unit tests for the process_hot_functions module."""
+
+from process_hot_functions import HotFunctionsProcessor, ParseArguments
+
+import mock
+import os
+import shutil
+import tempfile
+import unittest
+
+
+class ParseArgumentsTest(unittest.TestCase):
+ """Test class for command line argument parsing."""
+
+ def __init__(self, *args, **kwargs):
+ super(ParseArgumentsTest, self).__init__(*args, **kwargs)
+
+ def testParseArguments(self):
+ arguments = \
+ ['-p', 'dummy_pprof', '-c', 'dummy_common', '-e', 'dummy_extra', '-w',
+ 'dummy_cwp']
+ options = ParseArguments(arguments)
+
+ self.assertEqual(options.pprof_path, 'dummy_pprof')
+ self.assertEqual(options.cwp_hot_functions_file, 'dummy_cwp')
+ self.assertEqual(options.common_functions_path, 'dummy_common')
+ self.assertEqual(options.extra_cwp_functions_file, 'dummy_extra')
+
+ @mock.patch('sys.exit')
+ def testDeathParseArguments(self, sys_exit_method):
+ self.assertFalse(sys_exit_method.called)
+ ParseArguments([])
+ self.assertTrue(sys_exit_method.called)
+ self.assertNotEqual(sys_exit_method.return_value, 0)
+
+
+class HotFunctionsProcessorTest(unittest.TestCase):
+ """Test class for HotFunctionsProcessor class."""
+
+ def __init__(self, *args, **kwargs):
+ super(HotFunctionsProcessorTest, self).__init__(*args, **kwargs)
+ self._pprof_path = 'testdata/input/pprof'
+ self._cwp_functions_file = 'testdata/input/cwp_functions_file.csv'
+ self._cwp_functions_file_parsing = \
+ 'testdata/input/parse_cwp_statistics.csv'
+ self._common_functions_path = ''
+ self._expected_common_functions_path = 'testdata/expected/pprof_common'
+ self._extra_cwp_functions_file = ''
+
+ def _CreateHotFunctionsProcessor(self, extra_cwp_functions_file):
+ return HotFunctionsProcessor(self._pprof_path, self._cwp_functions_file,
+ self._common_functions_path,
+ extra_cwp_functions_file)
+
+ @mock.patch.object(HotFunctionsProcessor, 'ExtractCommonFunctions')
+ @mock.patch.object(HotFunctionsProcessor, 'ExtractExtraFunctions')
+ def testProcessHotFunctions(self, common_functions_method,
+ extra_functions_method):
+ hot_functions_processor = self._CreateHotFunctionsProcessor(
+ self._extra_cwp_functions_file)
+
+ hot_functions_processor.ProcessHotFunctions()
+
+ self.assertTrue(common_functions_method.called)
+ self.assertTrue(extra_functions_method.called)
+ self.assertEqual(common_functions_method.call_count, 1)
+ self.assertEqual(extra_functions_method.call_count, 1)
+
+ def testParseCWPStatistics(self):
+ cwp_statistics = {'dummy_method1,dummy_file1': ('dummy_object1,1', 0),
+ 'dummy_method2,dummy_file2': ('dummy_object2,2', 0),
+ 'dummy_method3,dummy_file3': ('dummy_object3,3', 0),
+ 'dummy_method4,dummy_file4': ('dummy_object4,4', 0)}
+ hot_functions_processor = self._CreateHotFunctionsProcessor(
+ self._extra_cwp_functions_file)
+ result = hot_functions_processor.ParseCWPStatistics(
+ self._cwp_functions_file_parsing)
+
+ self.assertDictEqual(result, cwp_statistics)
+
+ def testExtractCommonFunctions(self):
+ hot_functions_processor = self._CreateHotFunctionsProcessor(
+ self._extra_cwp_functions_file)
+ common_functions_path = tempfile.mkdtemp()
+ hot_functions_processor.ExtractCommonFunctions(self._pprof_path,
+ common_functions_path,
+ self._cwp_functions_file)
+ expected_files = \
+ [os.path.join(self._expected_common_functions_path, expected_file)
+ for expected_file in os.listdir(self._expected_common_functions_path)]
+ result_files = \
+ [os.path.join(common_functions_path, result_file)
+ for result_file in os.listdir(common_functions_path)]
+
+ expected_files.sort()
+ result_files.sort()
+
+ for expected_file_name, result_file_name in \
+ zip(expected_files, result_files):
+ with open(expected_file_name) as expected_file, \
+ open(result_file_name) as result_file:
+ expected_output_lines = expected_file.readlines()
+ result_output_lines = result_file.readlines()
+ self.assertListEqual(expected_output_lines, result_output_lines)
+ shutil.rmtree(common_functions_path)
+
+ def testExtractExtraFunctions(self):
+ cwp_statistics = {'dummy_method1,dummy_file1': ('dummy_object1,1', 0),
+ 'dummy_method2,dummy_file2': ('dummy_object2,2', 1),
+ 'dummy_method3,dummy_file3': ('dummy_object3,3', 1),
+ 'dummy_method4,dummy_file4': ('dummy_object4,4', 0)}
+ expected_output_lines = ['function,file,dso,inclusive_count\n',
+ 'dummy_method1,dummy_file1,dummy_object1,1\n',
+ 'dummy_method4,dummy_file4,dummy_object4,4']
+ temp_file, temp_filename = tempfile.mkstemp()
+ hot_functions_processor = self._CreateHotFunctionsProcessor(temp_filename)
+ os.close(temp_file)
+
+ hot_functions_processor.ExtractExtraFunctions(cwp_statistics, temp_filename)
+
+ with open(temp_filename) as result_file:
+ result_output_lines = result_file.readlines()
+
+ self.assertListEqual(result_output_lines, expected_output_lines)
+ os.remove(temp_filename)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/user_activity_benchmarks/testdata/expected/pprof_common/file1.pprof b/user_activity_benchmarks/testdata/expected/pprof_common/file1.pprof
new file mode 100644
index 00000000..30d4c83a
--- /dev/null
+++ b/user_activity_benchmarks/testdata/expected/pprof_common/file1.pprof
@@ -0,0 +1,3 @@
+function,file,dso,inclusive_count,flat,flat%,sum%,cum,cum%
+blink::ElementV8Internal::getAttributeMethodCallback,/var/cache/chromeos-chrome/chrome-src-internal/src/out_gnawty/Release/gen/blink/bindings/core/v8/V8Element.cpp,debug/opt/google/chrome/chrome,30638548,3007599556,0.81%,42.16%,13057167098,3.51%
+base::RunLoop::Run,/home/chrome-bot/chrome_root/src/base/run_loop.cc,/opt/google/chrome/chrome,21484525,2725201614,0.73%,45.17%,3511333688,0.94% \ No newline at end of file
diff --git a/user_activity_benchmarks/testdata/expected/pprof_common/file2.pprof b/user_activity_benchmarks/testdata/expected/pprof_common/file2.pprof
new file mode 100644
index 00000000..bef92666
--- /dev/null
+++ b/user_activity_benchmarks/testdata/expected/pprof_common/file2.pprof
@@ -0,0 +1,2 @@
+function,file,dso,inclusive_count,flat,flat%,sum%,cum,cum%
+blink::InvalidationSet::invalidatesElement,/home/chrome-bot/chrome_root/src/third_party/WebKit/Source/core/css/invalidation/InvalidationSet.cpp,debug/opt/google/chrome/chrome,42293369,4585860529,3.95%,3.95%,13583834527,11.70% \ No newline at end of file
diff --git a/user_activity_benchmarks/testdata/expected/pprof_common/file3.pprof b/user_activity_benchmarks/testdata/expected/pprof_common/file3.pprof
new file mode 100644
index 00000000..7bac48e3
--- /dev/null
+++ b/user_activity_benchmarks/testdata/expected/pprof_common/file3.pprof
@@ -0,0 +1,4 @@
+function,file,dso,inclusive_count,flat,flat%,sum%,cum,cum%
+SkPackARGB32,/home/chrome-bot/chrome_root/src/third_party/skia/include/core/SkColorPriv.h,/opt/google/chrome/chrome,15535764,1628614163,1.64%,27.31%,1633246854,1.64%
+MOZ_Z_adler32,/home/chrome-bot/chrome_root/src/third_party/pdfium/third_party/zlib_v128/adler32.c,/opt/google/chrome/chrome,17825054,1455734663,1.46%,31.79%,1456692596,1.46%
+unpack_ubyte_b8g8r8a8_unorm,/build/gnawty/tmp/portage/media-libs/mesa-11.3.0-r14/work/Mesa-11.3.0/src/mesa/main/format_unpack.c,debug/opt/google/chrome/chrome,19183960,1137455802,1.14%,34.21%,1150209506,1.16% \ No newline at end of file
diff --git a/user_activity_benchmarks/testdata/input/cwp_functions_file.csv b/user_activity_benchmarks/testdata/input/cwp_functions_file.csv
new file mode 100644
index 00000000..6c5ed587
--- /dev/null
+++ b/user_activity_benchmarks/testdata/input/cwp_functions_file.csv
@@ -0,0 +1,38 @@
+function,file,dso,inclusive_count
+base::RunLoop::Run,/home/chrome-bot/chrome_root/src/base/run_loop.cc,debug/opt/google/chrome/chrome,45766441
+blink::InvalidationSet::invalidatesElement,/home/chrome-bot/chrome_root/src/third_party/WebKit/Source/core/css/invalidation/InvalidationSet.cpp,debug/opt/google/chrome/chrome,42293369
+base::MessageLoop::Run,/home/chrome-bot/chrome_root/src/base/message_loop/message_loop.cc,debug/opt/google/chrome/chrome,41135127
+blink::StyleInvalidator::RecursionCheckpoint::RecursionCheckpoint,debug/opt/google/chrome/chrome,38403286
+base::MessageLoop::RunTask,/home/chrome-bot/chrome_root/src/base/message_loop/message_loop.cc,debug/opt/google/chrome/chrome,38397557
+base::debug::TaskAnnotator::RunTask,/home/chrome-bot/chrome_root/src/base/debug/task_annotator.cc,debug/opt/google/chrome/chrome,38322520
+WTF::HashTableConstIterator::skipEmptyBuckets,debug/opt/google/chrome/chrome,34950293
+unpack_ubyte_b8g8r8a8_unorm /build/gnawty/tmp/portage/media-libs/mesa-11.3.0-r14/work/Mesa-11.3.0/src/mesa/main/format_unpack.c,debug/opt/google/chrome/chrome,34486616
+base::internal::RunnableAdapter::Run,/home/chrome-bot/chrome_root/src/base/bind_internal.h,debug/opt/google/chrome/chrome,34281237
+blink::Element::hasID /home/chrome-bot/chrome_root/src/third_party/WebKit/Source/core/dom/Element.h,debug/opt/google/chrome/chrome,34237955
+blink::ElementV8Internal::idAttributeGetterCallback,debug/opt/google/chrome/chrome,32481250
+_start,,debug/opt/google/chrome/chrome,32451253
+__libc_start_main,/var/tmp/portage/cross-x86_64-cros-linux-gnu/glibc-2.19-r9/work/glibc-2.19/csu/libc-start.c,debug/lib64/libc-2.19.so,32124944
+blink::ElementV8Internal::getAttributeMethodCallback,/var/cache/chromeos-chrome/chrome-src-internal/src/out_gnawty/Release/gen/blink/bindings/core/v8/V8Element.cpp,debug/opt/google/chrome/chrome,30638548
+sha_transform /mnt/host/source/src/third_party/kernel/v3.10/lib/sha1.c,debug/opt/google/chrome/chrome,30615551
+ChromeMain,/home/chrome-bot/chrome_root/src/chrome/app/chrome_main.cc,debug/opt/google/chrome/chrome,30595408
+__clone,sysdeps/unix/sysv/linux/x86_64/clone.S,debug/lib64/libc-2.19.so,25480585
+start_thread,/var/tmp/portage/cross-x86_64-cros-linux-gnu/glibc-2.19-r9/work/glibc-2.19/nptl/pthread_create.c,debug/lib64/libpthread-2.19.so,24504351
+base::RunLoop::Run,/home/chrome-bot/chrome_root/src/base/run_loop.cc,/opt/google/chrome/chrome,21484525
+base::(anonymous namespace)::ThreadFunc,/home/chrome-bot/chrome_root/src/base/threading/platform_thread_posix.cc,debug/opt/google/chrome/chrome,20700177
+base::Callback::Run,/home/chrome-bot/chrome_root/src/base/callback.h,/opt/google/chrome/chrome,20455633
+,,//anon,20220979
+SkSwizzle_RB /home/chrome-bot/chrome_root/src/third_party/skia/include/core/SkColorPriv.h,debug/opt/google/chrome/chrome,19673187
+base::MessageLoop::Run,/home/chrome-bot/chrome_root/src/base/message_loop/message_loop.cc,/opt/google/chrome/chrome,19247788
+scheduler::TaskQueueManager::DoWork,/home/chrome-bot/chrome_root/src/components/scheduler/base/task_queue_manager.cc,debug/opt/google/chrome/chrome,19207528
+unpack_ubyte_b8g8r8a8_unorm,/build/gnawty/tmp/portage/media-libs/mesa-11.3.0-r14/work/Mesa-11.3.0/src/mesa/main/format_unpack.c,debug/opt/google/chrome/chrome,19183960
+scheduler::TaskQueueManager::ProcessTaskFromWorkQueue,/home/chrome-bot/chrome_root/src/components/scheduler/base/task_queue_manager.cc,debug/opt/google/chrome/chrome,18975400
+base::MessageLoop::DeferOrRunPendingTask,/home/chrome-bot/chrome_root/src/base/message_loop/message_loop.cc,/opt/google/chrome/chrome,17864182
+,[anon],100011
+blink::DocumentV8Internal::getElementByIdMethodCallbackForMainWorld /var/cache/chromeos-chrome/chrome-src-internal/src/out_gnawty/Release/gen/blink/bindings/core/v8/V8Document.cpp,/opt/google/chrome/chrome,17862466
+MOZ_Z_adler32,/home/chrome-bot/chrome_root/src/third_party/pdfium/third_party/zlib_v128/adler32.c,/opt/google/chrome/chrome,17825054
+base::internal::Invoker::Run,/home/chrome-bot/chrome_root/src/base/bind_internal.h,/opt/google/chrome/chrome,16438965
+base::MessageLoop::DoWork,/home/chrome-bot/chrome_root/src/base/message_loop/message_loop.cc,/opt/google/chrome/chrome,16029394
+base::internal::InvokeHelper::MakeItSo,/home/chrome-bot/chrome_root/src/base/bind_internal.h,/opt/google/chrome/chrome,15569953
+SkPackARGB32,/home/chrome-bot/chrome_root/src/third_party/skia/include/core/SkColorPriv.h,/opt/google/chrome/chrome,15535764
+base::Thread::ThreadMain,/home/chrome-bot/chrome_root/src/base/threading/thread.cc,debug/opt/google/chrome/chrome,15094458
+_start,,/opt/google/chrome/chrome,15014598
diff --git a/user_activity_benchmarks/testdata/input/parse_cwp_statistics.csv b/user_activity_benchmarks/testdata/input/parse_cwp_statistics.csv
new file mode 100644
index 00000000..833beeed
--- /dev/null
+++ b/user_activity_benchmarks/testdata/input/parse_cwp_statistics.csv
@@ -0,0 +1,6 @@
+function,file,dso,inclusive_count
+dummy_method1,dummy_file1,dummy_object1,1
+dummy_method2,dummy_file2,dummy_object2,2
+,,321223321,1
+dummy_method3,dummy_file3,dummy_object3,3
+dummy_method4,dummy_file4,dummy_object4,4
diff --git a/user_activity_benchmarks/testdata/input/pprof/file1.pprof b/user_activity_benchmarks/testdata/input/pprof/file1.pprof
new file mode 100644
index 00000000..62e327b8
--- /dev/null
+++ b/user_activity_benchmarks/testdata/input/pprof/file1.pprof
@@ -0,0 +1,20 @@
+File: perf
+Build ID: 1000000000
+Type: instructions_event
+Showing nodes accounting for 239632475284, 64.41% of 372058624378 total
+Dropped 33979 nodes (cum <= 1860293121)
+ flat flat% sum% cum cum%
+ 115734836217 31.11% 31.11% 329503350629 88.56% [anon]
+ 9839378797 2.64% 33.75% 14384869492 3.87% blink::v8StringToWebCoreString /home/chrome-bot/chrome_root/src/third_party/WebKit/Source/bindings/core/v8/V8StringResource.cpp
+ 6054608957 1.63% 35.38% 8069380147 2.17% v8::Object::GetAlignedPointerFromInternalField /home/chrome-bot/chrome_root/src/v8/include/v8.h (inline)
+ 4651723038 1.25% 36.63% 8205985387 2.21% blink::ElementV8Internal::idAttributeGetterCallback /var/cache/chromeos-chrome/chrome-src-internal/src/out_gnawty/Release/gen/blink/bindings/core/v8/V8Element.cpp
+ 4569044106 1.23% 37.86% 6408862507 1.72% blink::NodeV8Internal::firstChildAttributeGetterCallbackForMainWorld /var/cache/chromeos-chrome/chrome-src-internal/src/out_gnawty/Release/gen/blink/bindings/core/v8/V8Node.cpp
+ 3354819815 0.9% 38.76% 3361796139 0.9% v8::internal::Internals::ReadField /home/chrome-bot/chrome_root/src/v8/include/v8.h (inline)
+ 3277220829 0.88% 39.64% 14077115947 3.78% blink::DocumentV8Internal::getElementByIdMethodCallbackForMainWorld /var/cache/chromeos-chrome/chrome-src-internal/src/out_gnawty/Release/gen/blink/bindings/core/v8/V8Document.cpp
+ 3225711531 0.87% 40.51% 3228415743 0.87% v8::internal::Internals::HasHeapObjectTag /home/chrome-bot/chrome_root/src/v8/include/v8.h (inline)
+ 3139339048 0.84% 41.35% 3144663928 0.85% v8::internal::Bitmap::MarkBitFromIndex /home/chrome-bot/chrome_root/src/v8/src/heap/spaces.h (inline)
+ 3007599556 0.81% 42.16% 13057167098 3.51% blink::ElementV8Internal::getAttributeMethodCallback /var/cache/chromeos-chrome/chrome-src-internal/src/out_gnawty/Release/gen/blink/bindings/core/v8/V8Element.cpp
+ 2907238921 0.78% 42.94% 2930031660 0.79% v8::base::NoBarrier_Load /home/chrome-bot/chrome_root/src/v8/src/base/atomicops_internals_x86_gcc.h (inline)
+ 2791274646 0.75% 43.69% 11058283504 2.97% v8::internal::MarkCompactMarkingVisitor::VisitUnmarkedObjects /home/chrome-bot/chrome_root/src/v8/src/heap/mark-compact.cc (inline)
+ 2786321388 0.75% 44.44% 2794002850 0.75% WTF::hashInt /home/chrome-bot/chrome_root/src/third_party/WebKit/Source/wtf/HashFunctions.h (inline)
+ 2725201614 0.73% 45.17% 3511333688 0.94% base::RunLoop::Run /home/chrome-bot/chrome_root/src/base/run_loop.cc
diff --git a/user_activity_benchmarks/testdata/input/pprof/file2.pprof b/user_activity_benchmarks/testdata/input/pprof/file2.pprof
new file mode 100644
index 00000000..c1e6331d
--- /dev/null
+++ b/user_activity_benchmarks/testdata/input/pprof/file2.pprof
@@ -0,0 +1,17 @@
+File: perf
+Build ID: 1000000000
+Type: instructions_event
+Showing nodes accounting for 48939666671, 42.14% of 116136877744 total
+Dropped 35196 nodes (cum <= 580684388)
+ flat flat% sum% cum cum%
+ 4585860529 3.95% 3.95% 13583834527 11.70% blink::InvalidationSet::invalidatesElement /home/chrome-bot/chrome_root/src/third_party/WebKit/Source/core/css/invalidation/InvalidationSet.cpp
+ 3791928512 3.27% 7.21% 35145646088 30.26% blink::StyleInvalidator::invalidate /home/chrome-bot/chrome_root/src/third_party/WebKit/Source/core/css/invalidation/StyleInvalidator.cpp
+ 2871318565 2.47% 9.69% 2979878602 2.57% blink::StyleInvalidator::RecursionCheckpoint::~RecursionCheckpoint /home/chrome-bot/chrome_root/src/third_party/WebKit/Source/core/css/invalidation/StyleInvalidator.h (inline)
+ 1914657964 1.65% 11.33% 2164475253 1.86% WTF::StringImpl::lower /home/chrome-bot/chrome_root/src/third_party/WebKit/Source/wtf/text/StringImpl.cpp
+ 1841071698 1.59% 12.92% 13112332809 11.29% blink::StyleInvalidator::RecursionData::matchesCurrentInvalidationSets /home/chrome-bot/chrome_root/src/third_party/WebKit/Source/core/css/invalidation/StyleInvalidator.cpp (inline)
+ 1825142681 1.57% 14.49% 1828134467 1.57% blink::StyleInvalidator::RecursionCheckpoint::RecursionCheckpoint /home/chrome-bot/chrome_root/src/third_party/WebKit/Source/core/css/invalidation/StyleInvalidator.h (inline)
+ 1727655605 1.49% 15.98% 1925839708 1.66% blink::Element::hasID /home/chrome-bot/chrome_root/src/third_party/WebKit/Source/core/dom/Element.h (inline)
+ 1548329435 1.33% 17.31% 14927333582 12.85% blink::StyleInvalidator::checkInvalidationSetsAgainstElement /home/chrome-bot/chrome_root/src/third_party/WebKit/Source/core/css/invalidation/StyleInvalidator.cpp (inline)
+ 1429307046 1.23% 18.54% 1931177544 1.66% WTF::HashTableConstIterator::skipEmptyBuckets /home/chrome-bot/chrome_root/src/third_party/WebKit/Source/wtf/HashTable.h
+ 1298665649 1.12% 19.66% 4872203383 4.20% blink::SelectorChecker::matchSelector /home/chrome-bot/chrome_root/src/third_party/WebKit/Source/core/css/SelectorChecker.cpp
+ 1241347773 1.07% 20.73% 88048746121 75.81% [anon]
diff --git a/user_activity_benchmarks/testdata/input/pprof/file3.pprof b/user_activity_benchmarks/testdata/input/pprof/file3.pprof
new file mode 100644
index 00000000..6cbf1247
--- /dev/null
+++ b/user_activity_benchmarks/testdata/input/pprof/file3.pprof
@@ -0,0 +1,21 @@
+File: perf
+Build ID: 1000000000
+Type: instructions_event
+Showing nodes accounting for 53216795676, 53.50% of 99475025143 total
+Dropped 39931 nodes (cum <= 497375125)
+ flat flat% sum% cum cum%
+ 6447071173 6.48% 6.48% 6461127774 6.50% s_mpv_mul_add_vec64 mpi/mpi_amd64_gas.s
+ 5026798026 5.05% 11.53% 5033673091 5.06% SkMulDiv255Round /home/chrome-bot/chrome_root/src/third_party/skia/include/core/SkMath.h (inline)
+ 3520577246 3.54% 15.07% 4431002672 4.45% wk_png_write_find_filter /home/chrome-bot/chrome_root/src/third_party/libpng/pngwutil.c
+ 2907776944 2.92% 18.00% 3738572984 3.76% __memcpy_sse2_unaligned ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S
+ 2632046464 2.65% 20.64% 2636062338 2.65% longest_match /home/chrome-bot/chrome_root/src/third_party/zlib/deflate.c (inline)
+ 1699966816 1.71% 22.35% 1699966816 1.71% _mm_set_epi32 /usr/lib/gcc/x86_64-cros-linux-gnu/4.9.x/include/emmintrin.h (inline)
+ 1669101893 1.68% 24.03% 1673814801 1.68% s_mp_sqr_comba_16 /build/gnawty/tmp/portage/dev-libs/nss-3.23-r1/work/nss-3.23/nss-.amd64/lib/freebl/mpi/mp_comba.c
+ 1634108599 1.64% 25.67% 4636591817 4.66% convert32_row /home/chrome-bot/chrome_root/src/third_party/skia/src/core/SkConfig8888.cpp
+ 1628614163 1.64% 27.31% 1633246854 1.64% SkPackARGB32 /home/chrome-bot/chrome_root/src/third_party/skia/include/core/SkColorPriv.h (inline)
+ 1541044177 1.55% 28.86% 3001680713 3.02% convert32 /home/chrome-bot/chrome_root/src/third_party/skia/src/core/SkConfig8888.cpp (inline)
+ 1458290775 1.47% 30.32% 1459976296 1.47% SkSwizzle_RB /home/chrome-bot/chrome_root/src/third_party/skia/include/core/SkColorPriv.h (inline)
+ 1455734663 1.46% 31.79% 1456692596 1.46% MOZ_Z_adler32 /home/chrome-bot/chrome_root/src/third_party/pdfium/third_party/zlib_v128/adler32.c
+ 1272700545 1.28% 33.07% 1858067219 1.87% sha_transform /mnt/host/source/src/third_party/kernel/v3.10/lib/sha1.c
+ 1137455802 1.14% 34.21% 1150209506 1.16% unpack_ubyte_b8g8r8a8_unorm /build/gnawty/tmp/portage/media-libs/mesa-11.3.0-r14/work/Mesa-11.3.0/src/mesa/main/format_unpack.c (inline)
+ 1036731662 1.04% 35.25% 32561535338 32.73% [anon]
diff --git a/user_activity_benchmarks/testdata/results/pprof_common/file1.pprof b/user_activity_benchmarks/testdata/results/pprof_common/file1.pprof
new file mode 100644
index 00000000..30d4c83a
--- /dev/null
+++ b/user_activity_benchmarks/testdata/results/pprof_common/file1.pprof
@@ -0,0 +1,3 @@
+function,file,dso,inclusive_count,flat,flat%,sum%,cum,cum%
+blink::ElementV8Internal::getAttributeMethodCallback,/var/cache/chromeos-chrome/chrome-src-internal/src/out_gnawty/Release/gen/blink/bindings/core/v8/V8Element.cpp,debug/opt/google/chrome/chrome,30638548,3007599556,0.81%,42.16%,13057167098,3.51%
+base::RunLoop::Run,/home/chrome-bot/chrome_root/src/base/run_loop.cc,/opt/google/chrome/chrome,21484525,2725201614,0.73%,45.17%,3511333688,0.94% \ No newline at end of file
diff --git a/user_activity_benchmarks/testdata/results/pprof_common/file2.pprof b/user_activity_benchmarks/testdata/results/pprof_common/file2.pprof
new file mode 100644
index 00000000..bef92666
--- /dev/null
+++ b/user_activity_benchmarks/testdata/results/pprof_common/file2.pprof
@@ -0,0 +1,2 @@
+function,file,dso,inclusive_count,flat,flat%,sum%,cum,cum%
+blink::InvalidationSet::invalidatesElement,/home/chrome-bot/chrome_root/src/third_party/WebKit/Source/core/css/invalidation/InvalidationSet.cpp,debug/opt/google/chrome/chrome,42293369,4585860529,3.95%,3.95%,13583834527,11.70% \ No newline at end of file
diff --git a/user_activity_benchmarks/testdata/results/pprof_common/file3.pprof b/user_activity_benchmarks/testdata/results/pprof_common/file3.pprof
new file mode 100644
index 00000000..7bac48e3
--- /dev/null
+++ b/user_activity_benchmarks/testdata/results/pprof_common/file3.pprof
@@ -0,0 +1,4 @@
+function,file,dso,inclusive_count,flat,flat%,sum%,cum,cum%
+SkPackARGB32,/home/chrome-bot/chrome_root/src/third_party/skia/include/core/SkColorPriv.h,/opt/google/chrome/chrome,15535764,1628614163,1.64%,27.31%,1633246854,1.64%
+MOZ_Z_adler32,/home/chrome-bot/chrome_root/src/third_party/pdfium/third_party/zlib_v128/adler32.c,/opt/google/chrome/chrome,17825054,1455734663,1.46%,31.79%,1456692596,1.46%
+unpack_ubyte_b8g8r8a8_unorm,/build/gnawty/tmp/portage/media-libs/mesa-11.3.0-r14/work/Mesa-11.3.0/src/mesa/main/format_unpack.c,debug/opt/google/chrome/chrome,19183960,1137455802,1.14%,34.21%,1150209506,1.16% \ No newline at end of file