簡體   English   中英

具有和不具有參數C / C ++的函數之間的執行時間

[英]Execution time between functions with & without arguments C/C++

我只想問以下情況下執行時間有何不同?

a)我們在main()聲明了變量,並使用參數在函數中將其發送

b)我們有全局變量,可以直接從不帶參數的函數中訪問它們

關鍵是我開始編寫一些Aps,並且看到了一些有關此的討論,但是我還沒有編寫任何使兩者之間的差異大幾毫秒的應用程序。

將參數傳遞給函數通常涉及以下兩個匯編程序指令之一: push param (和后來的pop param )或mov ax, param 由於處理器能夠在一秒鍾內完成更多(很多)操作,因此這種“優化”很可能不會被注意到(整個程序的幾毫秒低於錯誤余量)

使用全局變量代替函數參數會導致代碼混亂,幾乎不會引起注意,甚至可能不會提高性能。

所有這些取決於所使用的CPU和編譯器。

當您將參數傳遞給函數時,可能會發生以下情況之一:

  • 該參數存儲在CPU寄存器中。 這非常有效。
  • 該參數存儲在堆棧中。 這是最常見的。 函數啟動/完成時,將參數壓入/從堆棧中彈出/彈出堆棧會涉及一些較小的開銷。
  • 該參數根本不是新變量。 而是,編譯器內聯函數並使用原始變量進行修改。 這大約是您可以獲得的最高效率。

使用全局變量將比使用堆棧快得多。 它絕對比使用CPU寄存器快:在函數內部,無論如何計算,可能需要將該值加載到此類寄存器中。

應該注意的是,我們在這里和那里談論的是幾個CPU滴答聲。

我的建議:

  • 除非您對所使用的特定CPU有深入的硬件知識,否則切勿嘗試任何形式的手動優化。 如果您沒有這種知識,那么在99%的情況下,編譯器將比您更好地優化代碼。 因為編譯器端口很可能是給定系統的專家編寫的。 編譯器還知道整體性能情況,而程序員則不知道,因此編譯器更適合進行優化。
  • 除非您實際執行了正式的基准測試並在程序中發現了瓶頸,否則切勿嘗試任何形式的手動優化。
  • 全局變量使用起來非常糟糕且危險。 它們導致意大利面條代碼,並且不是線程安全的。
  • 如果您正在編寫某種高端桌面應用程序,例如PC程序或電話應用程序,那么使用全局變量來提高性能完全是胡說八道 首先,您所處的系統沒有實時性能! 在任何給定的時間,您的OS可能會決定在給程序指指點點的情況下咀嚼數十億個CPU滴答聲。 因此,不要追逐1或2個CPU滴答聲。
  • 僅當您正在開發與硬件非常接近且同時具有嚴格實時要求的嵌入式系統應用程序時,此類手動優化才有意義。

堆棧操作非常高效,由於堆棧可能位於高速緩存中,因此它們的工作效率更高。 這可能會使使用堆棧比不使用堆棧更快。

期望參數傳遞的變量比全局變量快很多。 在現代ABI中,大多數使用CPU寄存器傳遞功能參數,而CPU寄存器可立即使用。

全局變量必須從(靜態)內存中讀取。 更糟糕的是,靜態內存是在其自己的內存頁面上分配的,該頁面通常離您的堆棧(或堆)內存很遠。 這意味着高速緩存未命中的可能性更高,這又意味着訪問可能消耗大量CPU周期。

顯然,這很大程度上取決於您的使用模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM