This PR adds support for importing from Google's pprof format, which is a gzipped, protobuf encoded file format (that's incredibly well documented!) The [pprof http library](https://golang.org/pkg/net/http/pprof/) also offers an output of the trace file format, which continues to not be supported in speedscope to date (See #77). This will allow importing of profiles generated by the standard library go profiler for analysis of profiles containing heap allocation information, CPU profile information, and a few other things like coroutine creation information. In order to add support for that a number of dependent bits of functionality were added, which should each provide an easier path for future binary input sources - A protobuf decoding library was included ([protobufjs](https://www.npmjs.com/package/protobufjs)) which includes both a protobuf parser generator based on a .proto file & TypeScript definition generation from the resulting generated JavaScript file - More generic binary file import. Before this PR, all supported sources were plaintext, with the exception of Instruments 10 support, which takes a totally different codepath. Now binary file import should work when files are dropped, opened via file browsing, or opened via invocation of the speedscope CLI. - Transparent gzip decoding of imported files (this means that if you were to gzip compress another JSON file, then importing it should still work fine) Fixes #60. -- This is a [donation motivated](https://github.com/jlfwong/speedscope/issues/60#issuecomment-419660710) PR motivated by donations by @davecheney & @jmoiron to [/dev/color](https://www.devcolor.org/welcome) 🎉
54 lines
654 B
Go
54 lines
654 B
Go
package main
|
|
|
|
import "flag"
|
|
import "runtime/pprof"
|
|
import "os"
|
|
|
|
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
|
|
|
|
func alpha() {
|
|
z := 3
|
|
for i := 0; i < 100000; i++ {
|
|
z *= 3
|
|
}
|
|
}
|
|
|
|
func beta() {
|
|
z := 3
|
|
for i := 0; i < 100000; i++ {
|
|
z *= 3
|
|
}
|
|
}
|
|
|
|
func delta() {
|
|
z := 3
|
|
for i := 0; i < 100000; i++ {
|
|
z *= 3
|
|
}
|
|
alpha()
|
|
beta()
|
|
}
|
|
|
|
func gamma() {
|
|
z := 3
|
|
for i := 0; i < 100000; i++ {
|
|
z *= 3
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
if *cpuprofile != "" {
|
|
f, _ := os.Create(*cpuprofile)
|
|
pprof.StartCPUProfile(f)
|
|
defer pprof.StopCPUProfile()
|
|
}
|
|
|
|
for i := 0; i < 10000; i++ {
|
|
alpha()
|
|
beta()
|
|
delta()
|
|
gamma()
|
|
}
|
|
}
|