了解指標操作和 CPU/記憶體使用情況
php小編香蕉為您介紹指標操作和CPU/記憶體使用情況。在程式設計中,指標操作是一種強大的工具,可以直接存取和修改記憶體中的資料。透過了解指標操作,您可以更好地控制和優化程式碼的效能。另外,了解CPU和記憶體的使用情況對於最佳化程式也非常重要。透過監控和分析CPU和記憶體的使用情況,您可以找出潛在的效能問題,並採取相應的措施來提升程式的運作效率。在本文中,我們將為您詳細介紹指標操作和CPU/記憶體使用情況的相關知識,幫助您更好地理解和應用它們。
問題內容
我在工作中與一位同事討論將指標傳遞給函數和/或傳回指標是否更有效。
我整理了一些基準函數來測試執行此操作的不同方法。這些函數基本上接受一個變量,對其進行轉換並將其傳回。我們有 4 種不同的方法:
- 正常傳入變量,為轉換結果建立新變數並傳回它的副本
- 正常傳入變量,為轉換結果建立一個新變量,並傳回記憶體位址
- 傳入一個指向變數的指針,為轉換結果建立一個新變數並傳回該變數的副本
- 傳入一個指向變數的指針,將指針的值轉換,無需傳回任何內容。
package main import ( "fmt" "testing" ) type mystruct struct { mystring string } func acceptparamreturnvariable(s mystruct) mystruct { ns := mystruct{ fmt.sprintf("i'm quoting this: \"%s\"", s.mystring), } return ns } func acceptparamreturnpointer(s mystruct) *mystruct { ns := mystruct{ fmt.sprintf("i'm quoting this: \"%s\"", s.mystring), } return &ns } func acceptpointerparamreturnvariable(s *mystruct) mystruct { ns := mystruct{ fmt.sprintf("i'm quoting this: \"%s\"", s.mystring), } return ns } func acceptpointerparamnoreturn(s *mystruct) { s.mystring = fmt.sprintf("i'm quoting this: \"%s\"", s.mystring) } func benchmarknormalparamreturnvariable(b *testing.b) { s := mystruct{ mystring: "hello world", } var ns mystruct for i := 0; i < b.n; i++ { ns = acceptparamreturnvariable(s) } _ = ns } func benchmarknormalparamreturnpointer(b *testing.b) { s := mystruct{ mystring: "hello world", } var ns *mystruct for i := 0; i < b.n; i++ { ns = acceptparamreturnpointer(s) } _ = ns } func benchmarkpointerparamreturnvariable(b *testing.b) { s := mystruct{ mystring: "hello world", } var ns mystruct for i := 0; i < b.n; i++ { ns = acceptpointerparamreturnvariable(&s) } _ = ns } func benchmarkpointerparamnoreturn(b *testing.b) { s := mystruct{ mystring: "hello world", } for i := 0; i < b.n; i++ { acceptpointerparamnoreturn(&s) } _ = s }
我發現結果相當令人驚訝。
$ go test -run=XXXX -bench=. -benchmem goos: darwin goarch: amd64 pkg: XXXX cpu: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz BenchmarkNormalParamReturnVariable-16 10538138 103.3 ns/op 48 B/op 2 allocs/op BenchmarkNormalParamReturnPointer-16 9526380 201.2 ns/op 64 B/op 3 allocs/op BenchmarkPointerParamReturnVariable-16 7542066 147.0 ns/op 48 B/op 2 allocs/op BenchmarkPointerParamNoReturn-16 45897 119265 ns/op 924351 B/op 5 allocs/op
在運行這個之前,我認為最有效的方法是第四個測試,因為在被調用的函數範圍內沒有創建新變量,並且只傳遞內存地址,但是,似乎第四個是效率最低的,花費最多的時間,並且使用最多的記憶體。
有人可以向我解釋這一點,或者為我提供一些很好的閱讀連結來解釋這一點嗎?
解決方法
您所做的基準測試並不能回答您提出的問題。事實證明,微基準測試極其困難——不僅在 go 世界中,而且在一般情況下也是如此。
回到效率問題。通常,將指標傳遞給函數不會轉義到堆。通常,從函數傳回的指標確實會逃逸到堆中。通常是這裡的關鍵字。您無法真正說出編譯器何時在堆疊上以及何時在堆疊上分配某些內容。這不是一個小問題。可以在此處找到非常好的簡短解釋。
但是如果您需要知道,可以詢問。您可以從簡單地列印編譯器所做的最佳化決策開始。您可以透過將 m
標誌傳遞給 go 工具compile
來完成此操作。
go build -gcflags -m=1
如果傳遞大於 1 的整數,則會得到更詳細的輸出。如果它沒有給您優化程式所需的答案,請嘗試分析。它遠遠超出了記憶體分析的範圍。
一般來說,在日常工作中不要為幼稚的最佳化決策而煩惱。不要太執著於「通常......」的說法,因為在現實世界中,你永遠不知道。始終先以正確性優化為目標。然後僅在您確實需要並證明您需要它時才進行效能最佳化。不要猜測,不要相信。另外,請記住,go 正在發生變化,因此我們在一個版本中證明的內容不一定在另一個版本中也成立。
以上是了解指標操作和 CPU/記憶體使用情況的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

Golang在並發性上優於C ,而C 在原始速度上優於Golang。 1)Golang通過goroutine和channel實現高效並發,適合處理大量並發任務。 2)C 通過編譯器優化和標準庫,提供接近硬件的高性能,適合需要極致優化的應用。

goimpactsdevelopmentpositationality throughspeed,效率和模擬性。 1)速度:gocompilesquicklyandrunseff,IdealforlargeProjects.2)效率:效率:ITScomprehenSevestAndardArdardArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增強的Depleflovelmentimency.3)簡單性。

goisidealforbeginnersandsubableforforcloudnetworkservicesduetoitssimplicity,效率和concurrencyFeatures.1)installgromtheofficialwebsitealwebsiteandverifywith'.2)

Golang適合快速開發和並發場景,C 適用於需要極致性能和低級控制的場景。 1)Golang通過垃圾回收和並發機制提升性能,適合高並發Web服務開發。 2)C 通過手動內存管理和編譯器優化達到極致性能,適用於嵌入式系統開發。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。Golang以其并发模型和高效性能著称,Python则以简洁语法和丰富库生态系统著称。

Golang和C 在性能上的差異主要體現在內存管理、編譯優化和運行時效率等方面。 1)Golang的垃圾回收機制方便但可能影響性能,2)C 的手動內存管理和編譯器優化在遞歸計算中表現更為高效。

C 更適合需要直接控制硬件資源和高性能優化的場景,而Golang更適合需要快速開發和高並發處理的場景。 1.C 的優勢在於其接近硬件的特性和高度的優化能力,適合遊戲開發等高性能需求。 2.Golang的優勢在於其簡潔的語法和天然的並發支持,適合高並發服務開發。
