在简单的情况下,它只是对几行代码的强烈盯着是微不足道的:
class A {
var b: B?
}
class B {
var a: A?
}
var a = A()
var b = B()
a.b = b
b.a = a
Run Code Online (Sandbox Code Playgroud)
如何解决> 50k行代码项目的这个问题(从Objective-C/C++移植).例如,有没有办法开发一个工具来在运行时遍历对象图(就像在Java/C#世界中那样)?
我正在尝试对支持不佳的原型嵌入式平台进行一些性能分析.
我注意到GCC的-pg标志导致__gnu_mcount_nc在每个函数的入口处插入thunk .没有__gnu_mcount_nc可用的实现(并且供应商对协助不感兴趣),但是因为编写一个简单记录堆栈帧和当前循环计数的操作是微不足道的,所以我已经这样做了; 这工作正常,并且在调用者/被调用者图和最常被称为函数方面产生有用的结果.
我真的想获得有关在函数体中花费的时间的信息,但是我很难理解如何只使用条目而不是退出来解决这个问题,每个函数都被钩住了:你可以确切地知道每个函数的确切时间输入,但没有挂钩退出点,你不知道多少时间,直到你收到下一条信息属于被叫者和呼叫者多少.
尽管如此,GNU概要分析工具实际上可以在许多平台上收集函数的运行时信息,因此可能开发人员在实现这一目标时需要考虑一些方案.
我已经看到一些现有的实现,它们执行诸如维护阴影调用堆栈并将入口处的返回地址旋转到__gnu_mcount_nc,以便在被调用者返回时再次调用__gnu_mcount_nc; 然后,它可以将调用者/被调用者/ sp三元组与影子调用堆栈的顶部进行匹配,从而将此案例与条目调用区分开来,记录退出时间并正确返回调用者.
这种方法还有很多不足之处:
是否有一些明显更好的方法来实现__gnu_mcount_nc,以便-pg构建能够捕获函数退出以及我缺少的入口时间?
我最近在大型数据集上运行了一些用Go编写的数字代码,并且遇到了内存管理问题.在尝试分析问题时,我用三种不同的方式测量了程序的内存使用情况:使用Go的runtime/pprof包,使用unix time实用程序,以及手动累加我分配的数据大小.这三种方法并没有给我一致的结果.
下面是我正在分析的代码的简化版本.它分配了几个切片,将值放在每个索引处,并将每个切片放在父切片中:
package main
import (
"fmt"
"os"
"runtime/pprof"
"unsafe"
"flag"
)
var mprof = flag.String("mprof", "", "write memory profile to this file")
func main() {
flag.Parse()
N := 1<<15
psSlice := make([][]int64, N)
_ = psSlice
size := 0
for i := 0; i < N; i++ {
ps := make([]int64, 1<<10)
for i := range ps { ps[i] = int64(i) }
psSlice[i] = ps
size += int(unsafe.Sizeof(ps[0])) * len(ps)
}
if *mprof != "" …Run Code Online (Sandbox Code Playgroud) 更新(2019年1月24日):
这个问题在4年前被问到关于Go 1.4(并且仍在获得观点).从那时起,pprof的分析发生了巨大的变化.
原始问题:
我正在尝试描述我写的基于马提尼的服务器,我想描述一个请求,并获得函数的完整细分及其运行时间.我试过玩两种方法runtime/pprof,net/http/pprof但输出看起来像这样:
Total: 3 samples
1 33.3% 33.3% 1 33.3% ExternalCode
1 33.3% 66.7% 1 33.3% runtime.futex
1 33.3% 100.0% 2 66.7% syscall.Syscall
Run Code Online (Sandbox Code Playgroud)
Web视图也不是很有帮助.
我们经常介绍另一个程序,输出似乎是我需要的:
20ms of 20ms total ( 100%)
flat flat% sum% cum cum%
10ms 50.00% 50.00% 10ms 50.00% runtime.duffcopy
10ms 50.00% 100% 10ms 50.00% runtime.fastrand1
0 0% 100% 20ms 100% main.func·004
0 0% 100% 20ms 100% main.pruneAlerts
0 0% 100% 20ms 100% runtime.memclr
Run Code Online (Sandbox Code Playgroud)
我无法分辨出差异的来源.
我知道有一些工具如top和ps用于测量CPU使用率,但他们测量CPU使用率的方式是通过测量空闲任务未运行的时间.因此,例如,即使CPU由于高速缓存未命中而导致停顿,这些工具仍将认为CPU被占用.但是,我想要的是分析工具在停顿期间将CPU视为空闲.有没有这样做的工具?
我试图描述一些golang应用程序,但我没有那个工作,我已经按照这两个教程:
两者都说在向应用程序添加一些代码行后,你必须执行你的应用程序,我这样做了,我在屏幕上收到以下消息:
2015/06/16 12:04:00个人资料:cpu profiling enabled,/ var/folder/kg/4fxym1sn0bx02zl_2sdbmrhr9wjvqt/T /profile680799962/cpu.pprof
所以,我知道正在执行分析,将信息发送到文件.
但是,当我看到文件大小时,在我测试的任何程序中,它总是64字节.
当我尝试用pprof打开cpu.pprof文件时,我执行"top10"命令,我发现文件中没有任何内容:
("./fact"是我的应用)
go tool pprof ./fact /var/folders/kg/4fxym1sn0bx02zl_2sdbmrhr9wjvqt/T/profile680799962/cpu.pprof
top10 - >
(pprof)top10 0 of 0 total(0%)flat flat%sum%cum cum%
所以,当我分析时,就好像没有任何事情发生.
我已经在mac(本例)和ubuntu中测试了它,有三个不同的程序.
你知道我做错了吗?
然后示例程序非常简单,这是代码(是一个非常简单的因子程序,我从互联网上):
import "fmt"
import "github.com/davecheney/profile"
func fact(n int) int {
if n == 0 {
return 1
}
return n * fact(n-1)
}
func main() {
defer profile.Start(profile.CPUProfile).Stop()
fmt.Println(fact(30))
}
Run Code Online (Sandbox Code Playgroud)
谢谢,Fer
我写了一个Eratosthenes程序的筛子,ST.Strict当我看到它占用了大量的内存时,我正在剖析它:
Sun Jul 10 18:27 2016 Time and Allocation Profiling Report (Final)
Primes +RTS -hc -p -K1000M -RTS 10000000
total time = 2.32 secs (2317 ticks @ 1000 us, 1 processor)
total alloc = 5,128,702,952 bytes (excludes profiling overheads)
Run Code Online (Sandbox Code Playgroud)
(其中10 ^ 7)是我要求它生成的素数.
奇怪的是,分析图表显示了完全不同的东西:
我在其中一张图中误读了什么吗?或者这些工具之一有什么问题吗?
作为参考,我的代码是
{-# LANGUAGE BangPatterns #-}
import Prelude hiding (replicate, read)
import qualified Text.Read as T
import Data.Vector.Unboxed.Mutable(replicate, write, read)
import Control.Monad.ST.Strict
import Data.STRef
import Control.Monad.Primitive
import Control.Monad
import System.Environment
main = print . length …Run Code Online (Sandbox Code Playgroud) 基本上我想找到我的程序是否随着时间的推移泄漏goroutines.所以我想看看有多少goroutines正在运行.有没有办法做到这一点pprof?
我已经做了go tool pprof http://localhost:8888/debug/pprof/block.
这让我花了多长时间被阻止但没有运行多少例程.
我按照官方指南来描述我的JS:https://facebook.github.io/react-native/docs/android-ui-performance.html
但是当我得到结果时,我没有看到与js相关的代码:
知道发生了什么事吗?接口非常缓慢,占用了100%的CPU,但我没有信息.
编辑:看起来像使用最新的react-native版本可以解决这个问题,我正在使用0.30.0,看起来周围引入了一些相关的更改0.34.0
我想使用zipkin来描述传统程序的内部。
我使用“传统”一词,因为AFAIK zipkin用于在微服务环境中进行跟踪,其中一个请求由N个子请求计算得出。
我想分析我的python程序的性能。
我想跟踪完成的所有python方法调用和所有linux syscall。
如何跟踪python方法调用和linux syscalls以将跨度转换为zipkin?
即使不可行,我也很有趣如何做到这一点。我想学习zipkin的工作原理。