<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 13.10.1 時間和內存消耗 可以用這個便捷腳本?*xtime*?來測量: ~~~ #!/bin/sh /usr/bin/time -f ‘%Uu %Ss %er %MkB %C’ “$@” ~~~ 在 Unix 命令行中像這樣使用?`xtime goprogexec`,這里的 progexec 是一個 Go 可執行程序,這句命令行輸出類似:56.63u 0.26s 56.92r 1642640kB progexec,分別對應用戶時間,系統時間,實際時間和最大內存占用。 ## [](https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/13.10.md#13102-用-go-test-調試)13.10.2 用 go test 調試 如果代碼使用了 Go 中 testing 包的基準測試功能,我們可以用 gotest 標準的?`-cpuprofile`?和?`-memprofile`?標志向指定文件寫入 CPU 或 內存使用情況報告。 使用方式:`go test -x -v -cpuprofile=prof.out -file x_test.go` 編譯執行 x_test.go 中的測試,并向 prof.out 文件中寫入 cpu 性能分析信息。 ## [](https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/13.10.md#13103-用-pprof-調試)13.10.3 用 pprof 調試 你可以在單機程序 progexec 中引入 runtime/pprof 包;這個包以 pprof 可視化工具需要的格式寫入運行時報告數據。對于 CPU 性能分析來說你需要添加一些代碼: ~~~ var cpuprofile = flag.String(“cpuprofile”, “”, “write cpu profile to file”) func main() { flag.Parse() if *cpuprofile != “” { f, err := os.Create(*cpuprofile) if err != nil { log.Fatal(err) } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } ... ~~~ 代碼定義了一個名為 cpuprofile 的 flag,調用 Go flag 庫來解析命令行 flag,如果命令行設置了 cpuprofile flag,則開始 CPU 性能分析并把結果重定向到那個文件。(os.Create 用拿到的名字創建了用來寫入分析數據的文件)。這個分析程序最后需要在程序退出之前調用 StopCPUProfile 來刷新掛起的寫操作到文件中;我們用 defer 來保證這一切會在 main 返回時觸發。 現在用這個 flag 運行程序:`progexec -cpuprofile=progexec.prof` 然后可以像這樣用 gopprof 工具:`gopprof progexec progexec.prof` gopprof 程序是 Google pprofC++ 分析器的一個輕微變種;關于此工具更多的信息,參見[http://code.google.com/p/google-perftools/](http://code.google.com/p/google-perftools/)。 如果開啟了 CPU 性能分析,Go 程序會以大約每秒 100 次的頻率阻塞,并記錄當前執行的 goroutine 棧上的程序計數器樣本。 此工具一些有趣的命令: 1)`topN` 用來展示分析結果中最開頭的 N 份樣本,例如:`top5`?它會展示在程序運行期間調用最頻繁的 5 個函數,輸出如下: ~~~ Total: 3099 samples 626 20.2% 20.2% 626 20.2% scanblock 309 10.0% 30.2% 2839 91.6% main.FindLoops ... ~~~ 第 5 列表示函數的調用頻度。 2)`web`?或?`web 函數名` 該命令生成一份 SVG 格式的分析數據圖表,并在網絡瀏覽器中打開它(還有一個 gv 命令可以生成 PostScript 格式的數據,并在 GhostView 中打開,這個命令需要安裝 graphviz)。函數被表示成不同的矩形(被調用越多,矩形越大),箭頭指示函數調用鏈。 3)`list 函數名`?或?`weblist 函數名` 展示對應函數名的代碼行列表,第 2 列表示當前行執行消耗的時間,這樣就很好地指出了運行過程中消耗最大的代碼。 如果發現函數?`runtime.mallocgc`(分配內存并執行周期性的垃圾回收)調用頻繁,那么是應該進行內存分析的時候了。找出垃圾回收頻繁執行的原因,和內存大量分配的根源。 為了做到這一點必須在合適的地方添加下面的代碼: ~~~ var memprofile = flag.String(“memprofile”, “”, “write memory profile to this file”) ... CallToFunctionWhichAllocatesLotsOfMemory() if *memprofile != “” { f, err := os.Create(*memprofile) if err != nil { log.Fatal(err) } pprof.WriteHeapProfile(f) f.Close() return } ~~~ 用 -memprofile flag 運行這個程序:`progexec -memprofile=progexec.mprof` 然后你可以像這樣再次使用 gopprof 工具:`gopprof progexec progexec.mprof` `top5`,`list 函數名`?等命令同樣適用,只不過現在是以 Mb 為單位測量內存分配情況,這是 top 命令輸出的例子: ~~~ Total: 118.3 MB 66.1 55.8% 55.8% 103.7 87.7% main.FindLoops 30.5 25.8% 81.6% 30.5 25.8% main.*LSG·NewLoop ... ~~~ 從第 1 列可以看出,最上面的函數占用了最多的內存。 同樣有一個報告內存分配計數的有趣工具: ~~~ gopprof --inuse_objects progexec progexec.mprof ~~~ 對于 web 應用來說,有標準的 HTTP 接口可以分析數據。在 HTTP 服務中添加 ~~~ import _ “http/pprof” ~~~ 會為 /debug/pprof/ 下的一些 URL 安裝處理器。然后你可以用一個唯一的參數——你服務中的分析數據的 URL 來執行 gopprof 命令——它會下載并執行在線分析。 ~~~ gopprof http://localhost:6060/debug/pprof/profile # 30-second CPU profile gopprof http://localhost:6060/debug/pprof/heap # heap profile ~~~ 在 Go-blog(引用 15)中有一篇很好的文章用具體的例子進行了分析:分析 Go 程序(2011年6月)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看