簡體   English   中英

分析DLL / LIB膨脹

[英]Profiling DLL/LIB Bloat

我在VS2005中繼承了一個相當大的C ++項目,它編譯成一個大約5MB的DLL。 我想減少庫的大小,以便通過網絡為從慢速網絡共享中使用它的客戶端加載更快。

我知道如何通過分析代碼,包含和項目設置來做到這一點,但我想知道是否有任何可用的工具可以更容易地確定代碼的哪些部分消耗最多的空間。 有沒有辦法生成DLL布局的“配置文件”? 關於圖書館圖像消耗空間的報告以及多少?

構建DLL時,可以將/ MAP傳遞給鏈接器,使其生成包含結果圖像中所有符號地址的映射文件。 您可能需要編寫一些腳本來計算每個符號的大小。

使用“strings”實用程序掃描DLL可能會顯示意外或未使用的可打印字符串(例如資源,RCS ID, __FILE__宏,調試消息,斷言等)。

此外,如果你還沒有使用/ Os編譯,那么值得一試。

如果您的最終目標只是調整DLL的大小,那么在調整編譯器設置之后,您可能會通過UPX運行DLL來獲得最快的結果。 UPX是DLL和EXE的優秀壓縮實用程序; 它也是開源的,具有非病毒許可證,因此可以在商業/閉源產品中使用。

我只是在最高壓縮設置(蠻力選項)上發出了病毒警告,所以如果你使用較低的設置,你可能會沒問題。

雖然我不知道任何二進制大小分析器,但您可以選擇查找哪些目標文件(.obj)是最大的 - 這至少可以讓您了解問題點的位置。
當然,這需要一個足夠模塊化的項目。

您還可以嘗試靜態鏈接而不是使用DLL。 實際上,當庫靜態鏈接時,鏈接器會從最終的exe中刪除所有未使用的函數。 有時候最后的exe只會稍微大一些,而你沒有更多的dll。

如果你的DLL很大,因為它導出的C ++函數具有特別長的錯位名稱,另一種方法是使用.DEF文件按順序導出函數,不帶名稱(在.DEF文件中使用NONAME )。 有點脆,但它減少了DLL大小,EXE大小和加載時間。

參見例如http://home.hiwaay.net/~georgech/WhitePapers/Exporting/Exp.htm

鑒於您的所有.obj文件大小相同,假設您使用的是預編譯頭文件,請嘗試創建一個空的obj文件並查看其大小。 這將使您了解由於PCH編譯而導致的每個.obj的比例。 順便說一句,鏈接器將能夠刪除那里的所有重復項。 或者,您可以嘗試禁用PCH,以便obj文件可以更好地指示主要罪魁禍首。

所有好建議。 我所做的是獲取地圖文件,然后只是眼球。 我過去發現的那種事情是,大部分空間是由一個或多個類庫引入的,因為某個變量在某處被聲明為具有類似於它可以節省一些編碼的類型努力,但並非真的有必要。

就像在MFC中一樣(記得嗎?),他們有一個包裝類可以解決Win32提供的控件,字體等所有問題。 那些占用大量空間而你並不總是需要它們。

另一件可能占用大量空間的東西是你可以管理的集合類。 另一個是你不使用的cout I / O例程。

我會推薦以下之一:

覆蓋 - 您可以運行一個覆蓋工具,希望能夠檢測到一些死代碼

緩存 - 在初始激活時緩存客戶端上的dll

拆分 - 將dll分成幾個較小的dll,使用bootstrap dll啟動應用程序並在應用程序啟動后下載其他dll

編譯和鏈接 - 使用較小的運行時庫,使用大小優化進行編譯等。請參閱此鏈接以獲取更多建議。

壓縮 - 如果dll中有數據或大型資源,則只能在下載后或運行時壓縮它們並解壓縮。

暫無
暫無

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

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