Project Name | Stars | Downloads | Repos Using This | Packages Using This | Most Recent Commit | Total Releases | Latest Release | Open Issues | License | Language |
---|---|---|---|---|---|---|---|---|---|---|
Disruptor | 16,368 | 2,163 | 1,050 | 4 days ago | 28 | December 31, 2021 | 12 | apache-2.0 | Java | |
High Performance Inter-Thread Messaging Library | ||||||||||
Booster | 4,605 | 32 | 5 days ago | 256 | June 08, 2023 | 38 | apache-2.0 | Kotlin | ||
🚀Optimizer for mobile applications | ||||||||||
Happypack | 4,110 | 2,164 | 1,392 | 3 years ago | 38 | January 04, 2019 | 48 | mit | JavaScript | |
Happiness in the form of faster webpack build times. | ||||||||||
Piscina | 3,524 | 110 | 3 days ago | 21 | August 01, 2023 | 24 | other | TypeScript | ||
A fast, efficient Node.js Worker Thread Pool implementation | ||||||||||
Libgo | 2,942 | 2 | 3 months ago | 2 | April 30, 2020 | 111 | mit | C++ | ||
Go-style concurrency in C++11 | ||||||||||
Terarkdb | 1,907 | 10 days ago | 55 | apache-2.0 | C++ | |||||
A RocksDB compatible KV storage engine with better performance | ||||||||||
Easy_profiler | 1,899 | 4 months ago | 90 | mit | C++ | |||||
Lightweight profiler library for c++ | ||||||||||
Fflate | 1,784 | 311 | 5 days ago | 51 | May 22, 2023 | 3 | mit | TypeScript | ||
High performance (de)compression in an 8kB package | ||||||||||
Lazycache | 1,561 | 11 | 67 | 4 months ago | 21 | September 01, 2021 | 52 | mit | C# | |
An easy to use thread safe in-memory caching service with a simple developer friendly API for c# | ||||||||||
Yappi | 1,192 | 320 | 28 | a month ago | 22 | October 31, 2022 | 24 | mit | Python | |
Yet Another Python Profiler, but this time multithreading, asyncio and gevent aware. |
AFlame is a tool for extracting data from Android method trace files without having to use Traceview.
In order to generate some trace files, wrap your code under test like so:
Debug.startMethodTracing("traceName", 128 * 1024 * 1024);
// Code under test
Debug.stopMethodTracing();
If you are testing a particularly intensive section, you can use the sampling tracing method available on newer APIs that considerably ameliorates the tracer's performance impact.
This project relies on Brendan Gregg's excellent Flamegraph project to generate the graphs themselves.
To test out this tool without running it yourself, you can upload your trace file to https://aflame.rhye.org/ and get a result pretty quickly. If you don't have any traces yet, you can take a look at a sample trace from a recipe app here
I have posted in depth about the Android trace format here.
To run a local copy of AFlame (with rebar):
git clone [email protected]:rschlaikjer/erlang-atrace-flamegraphs.git aflame
cd aflame
# Update files/app.config to use a port and trace output location that suit
ERL_FLAGS="-config files/app.config" rebar3 shell
# Open it up in your browser
xdg-open http://localhost:8192/
This repository also contains a Dockerfile that can be used to run the system without installing all the necessary dependencies on the host. To do so,
# From within the top level of this repo
docker build .
# Take the successfully built hash from the docker build output as $HASH
# For very large traces, you may need to increase the memory the container
# is allowed to use by passing --memory=3g (or more, as necessary).
docker run --rm -it $HASH
The information here is based on the ART implementation of tracing, which can be viewed here: https://android.googlesource.com/platform/art/+/master/runtime/trace.cc https://android.googlesource.com/platform/art/+/master/runtime/trace.h
Plain text section of key=value pairs. Includes general info about the trace.
thread-cpu
(Clock is CPU time), wall
(Clock is wall clock) or dual
(Both are present)For traces with GC tracking, the header can also contain:
Plain text section of tab separated pairs. Each pair is a base 10 thread ID, and a thread name. This numeric thread ID is referenced from the trace data section.
Plain text section of tab separated pairs. Each line is a 5-tuple of:
The method ID is referenced from the trace data section. The number here is actually the real method ID left shifted two bits - this is explained in the data section.
All numbers are stored as little-endian.
Header:
Data records (v3):
Each method record denotes an event that occurred in the given method. The method itself is identified by the high 14 bits of the compound method ID, which matches against the methods table higher in the file. The action is one of three currently defined:
I interpret the unwind as a return for the purposes of the graphs; this is
based on what I can glean from reading up on when an unwind is issued by the
interpreter
here
, and the part of the interpreter that then checks for kDexNoIndex
here
By pushing and popping the records onto a virtual stack per thread, you can recreate the trace, and use the offsets to work out how much time was spent in each function.
All parsing code can be seen here.
Copyright 2018 Ross Schlaikjer
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.