![](/img/trans.png)
[英]What's the performance penalty, if any, of using a SecurityManager
[英]What is the performance penalty of operator overloading STL
我非常喜歡STL。 它使編碼算法非常方便,因為它為您提供了所有原語,例如,分區,查找,binary_search,迭代器,priority_queue等。此外,您完全不必擔心內存泄漏。
我唯一關心的是要使STL工作所需的運算符重載性能損失。 為了進行比較,我認為這取決於==提供所需的語義。 如果要將類添加到容器中,則需要重載== operator。
我為這種便利而損失了多少效率?
關於內存泄漏的另一個問題:
在泛型類型上使用stl算法時,必須以某種方式提供比較邏輯。 運算符重載不會對任何其他函數造成性能損失,並且可以像其他任何函數一樣內聯以消除任何函數調用開銷。
許多標准容器和算法也使用std::less
,因此默認情況下<
而不是==
。
標准容器本身不會泄漏,但是您可以使用它們來容納不一定清除其“擁有”內存的對象(例如指針)。
很難在Java中泄漏內存,但這並不意味着您不會因缺乏良好的對象所有權語義而陷入麻煩,也不意味着您無法耗盡所有可用的內存並導致崩潰。
我將把C ++答案留給以前的海報,但100%是的,您可能會在Java中發生內存泄漏。 除非您有一些不錯的內存分析工具可以查看,否則也很難找到它。 通常,當您重復實例化對象時,會發生自動垃圾回收語言(例如Java,Python等)中的內存泄漏,但是A.在完成對對象的處理后(例如在調用“ close”時不清除它們)數據庫連接)或B.繼續保留指向它們的其他對象(例如Hashtables),以便自動垃圾收集器永遠無法對其進行垃圾收集。
如果您的應用程序處於您認為應該處於穩定狀態的狀態,那么您將獲得以下之一:
http://java.sun.com/javase/6/docs/api/java/lang/OutOfMemoryError.html
您正在進行一些有趣的調試;)
由於運算符重載只會導致函數調用,並且您必須編寫一個函數來完成工作,因此開銷為零。 運算符重載只是一種便利,因此您可以執行x == y代替x.equals(y)或x <y代替x.compaterTo(y)之類的操作。 編譯器本質上會生成類似x。==(y)或x。<(y)的東西(雖然不會編譯,但是您可以理解)。
“罰款”實際上是一種獎金。
讓我們以最典型的算法進行排序。 C沒有運算符重載。 結果, qsort
了一個函數指針。 每個比較都使用一個間接函數調用(在運行時)。 C ++確實有運算符重載。 對於std::sort
,每個比較都是直接調用(由鏈接器固定)或內聯(由編譯器)。 這是非常有效的。 std::sort
比qsort
快6倍並不罕見。
通常,運算符重載使類型的“默認”函數的表達變得容易得多,其方式可以被其他代碼和編譯器利用。 替代方案的效率要低得多。 他們要么依賴宏(對程序員不利),要么依賴函數指針(對優化程序和CPU不利)。
我唯一關心的是要使STL工作所需的運算符重載性能損失。 為了進行比較,我認為這取決於==提供所需的語義。 如果要將類添加到容器中,則需要重載== operator。
它不存在。 重載的運算符通過函數調用實現。 而且,如果您沒有重載運算符,則需要定義一個函數來代替。 因此,使用更簡潔的語法,性能完全相同 。
除此之外,您始終可以讓您的操作員內聯,這甚至不會帶來函數調用的損失。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.