簡體   English   中英

為什么我的C代碼運行緩慢?

[英]Why does my C code run slow?

我在C中編寫了一些代碼,我驚訝地發現它執行的時間比我預期的要長。 我想知道哪些操作成本高昂以及如何擺脫它們。

我使用賦值語句,條件(嵌套),循環,函數調用和回調。

對常見的C性能缺陷有什么好的參考?

我可以使用一個好的剖析器嗎?


謝謝你們

感謝您的所有投入。 你是絕對正確的:它的算法可以減慢事情(大幅度)。 雖然通過編碼實踐可以獲得一點性能提升 - 我100%確信只有錯誤的算法才能大大減慢速度

事實上:我正在研究RB樹並按升序插入節點。 花了很多時間(和Binary Search Tree(Skewed)一樣糟糕)。 在尋求你的建議后,我檢查了算法,我在平衡方面犯了一個錯誤,使樹傾斜(傾斜)。 我糾正了。

再次感謝您的建議。

您的性能問題可能與您實施的算法有關,而與您使用的操作有關。

發布代碼可能很有用。 告訴我們你正在嘗試做什么,以及你正在使用什么算法也會有所幫助。 事實上,您的問題並沒有為任何人提供足夠的信息來為您提供有用的答案。

其他人推薦gprof - 我是第二個,如果你有興趣分析你的代碼。 我之前也使用過VTune,並喜歡它。 但首先要確保您了解您的代碼及其功能,並且在處理您希望它處理的數據大小時,您實現的算法是節省時間的。

順便說一句,使用C並不意味着您的代碼會自動運行得更快。 通常,I / O綁定代碼看不到性能改進。 UI重代碼可能無法從使用低級語言中受益。 通常,C是一種更好的實現語言,您需要低級訪問,與硬件或低級操作系統服務連接,或者如果您有非常具體和嚴格的性能要求,這些要求很難在高級別,垃圾收集語言中滿足。 或者如果您碰巧喜歡C,但這顯然是一個主觀問題。

這是一個陳舊的主題。

分析是一種選擇,但是如果你有一個調試器,有一些老式的技術可以很好地工作:

  • 如果不需要一整天,請將代碼單步執行。 我保證如果它正在做任何不需要的事情,你會得到一個很好的主意。

  • 如果這需要太長時間,只需給它足夠的數據,或讓程序在頂層重復,這樣它就可以運行很長時間,至少幾秒鍾。 在它運行時,手動中斷它並記錄它正在做什么以及為什么 這樣做幾次。 保證,您將從單步執行中獲得相同的洞察力。

不要做大多數人做的事。 大多數人所做的是1)勇敢地談論剖析,然后2)猜測問題是什么並解決這個問題。 如果你正在尋找“快速操作”,你就錯過了這一點。 在你通過上述調查之一證明它是什么之前,你永遠不會解決正確的事情。

在WikiHow上解釋

關於SO的一個很好的解釋

不要浪費時間試圖找到“昂貴”的操作。 當然,除了圖書館之外,C中幾乎沒有。

相反,嘗試估計您執行代碼的每個部分的次數。 例如,假設您將文件的每一行與另一行的每一行進行比較。 如果每個文件都有大約一百行,那么你將進行大約一萬次比較。 沒什么好擔心的......但是如果你從文件的開頭選擇每一行,你就會讀到每一行50萬次。 現在這不好。 你需要一些真正的隨機訪問方式來讀取每一行....或者,更好的是,閱讀有關散列的內容

在'大O'表示法中:如果nm相似,則全集比較為O(nxm) ,或大致為O(n^2) 但順序讀數平均為O(n/2) ,因此在讀數上整個事件是O(n^3/2)加上O(n^2) 使用散列,它將是aO(2n)+bO(2n)+cO(n^2) ,或者只是O(n^2)

優化算法,而不是代碼。

檢查內存分配。 和函數調用。 如果您正在使用gcc,請使用-pg選項使用分析信息對其進行編譯,並通過gprof運行它。 VS Team System版附帶了自己的Profiler。 所以,請選擇。

這是不可能的。 你所命名的元素都不是很慢,即使它們是,它也不會自動意味着整個程序會因為它們而變慢。

您最好在啟用了性能分析的情況下運行代碼,並查看哪些部分成本最高。 (這取決於你的平台你將如何實際做到這一點)。

有關MSVC的信息,請參閱此文章此博客條目,了解MSVS下的分析甚至此問題,特別是AMD CodeAnalyst答案

你有權訪問GNU工具鏈嗎? 如果是這樣,請查看“gprof”。 它是一個探測器......很適合發現瓶頸。

暫無
暫無

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

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