C++函數式編程(五)效能影響

來源:互聯網
上載者:User

原文:http://www.altdevblogaday.com/2012/04/26/functional-programming-in-c/

作者:John Carmack

-潘宏 譯

-2013年1月

-email:
popyy@netease.com

-weibo.com/panhong101

大多數情況下,直接操縱記憶體是最快的,否則肯定慢點。當然,大多時候也就這麼說說而已,我們一直都為了趕進度而不顧效能。

編寫純函數會產生更多的資料拷貝,所以在一些要求效能的場合下,這種開發方法就不太合適。舉個極端點的例子:把DrawTriangle()寫成純函數,傳入一個幀緩衝作為參數,然後複製出一個新的幀緩衝,把三角形渲染到新緩衝上再返回。可千萬別這麼幹。

按值返回是函數式編程的本性,但依賴編譯器那不靠譜的傳回值最佳化技術,效能怕是保證不了。所以對複雜資料來說,通過引用型參數實現輸出比較合理,但這麼做,就無法把該參數修飾為const,也就沒法強制該參數成為單次賦值(Single Assignment)。

引用型參數和按值返回是函數的兩個頗具爭議的輸出方式,修改引用會失去執行緒安全性,所以別輕易就這麼做。列表產生是個對返回結果方式有利的證明,對此,純函數的方法是將傳入的列表拷貝一個新的,然後把元素添加到新列表之後並返回,原始列表保持不變。函數式語言在內部實現上擅長做這種事,但你膽敢用C++容器這麼寫的話就死定了。

還有一個要考慮的緩解因素就是:現今,提高效能就意味著並行編程,就算是在最優效能的情況下,它也會比單線程環境牽扯更多的資料拷貝與合并。這導致複製代價和複雜度降低,而正確率相應提高。當考慮遊戲的運行狀態,比如一個並行遊戲世界中的所有角色時,我們就會發現用OO的方式來實現這種並行性難度極大。可能每個遊戲對象開始只是引用一個唯讀世界狀態,但卻需要在每幀結束後都拷貝一次更新後的世界對象...還是給我打住吧...

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.