2008-09-15 45 views
2

您可以編寫一個函數,然後查看生成的程序集,您會發現它可以得到改進。重構拆解代碼

爲了便於閱讀,您希望保留您編寫的函數,但是您希望將自己的程序集替換爲編譯器。有沒有什麼方法可以在你的高級語言功能和新裝配之間建立關係?

回答

3

如果你正在查看程序集,那麼它的公平假設你已經很好地理解了如何編譯代碼。如果你有這方面的知識,那麼它有時可能會將「改變工程師」的改變恢復爲原來的語言,但最好不要打擾。

與首次進行這些更改所需的時間和精力相比,您所做的優化可能非常小。我建議你把這種工作交給編譯器去喝杯茶。如果這些變化很重要,並且性能非常重要(就像在嵌入式世界中那樣),那麼您可能希望以某種方式將正常代碼與組合進行混合,然而,在大多數計算機和芯片上,性能通常足以避免這令人頭痛。

如果你真的需要更多的性能,那麼優化代碼而不是程序集。

2

沒有,我想。你已經拒絕了編譯器的工作以支持你自己的工作。您最好還是拋棄使用編譯語言編寫的函數,因爲現在您所擁有的僅僅是您在該平臺上的彙編程序。

我強烈建議不要參與這種優化,因爲除非您確定,通過分析和分析,您確實有所作爲。

1

它取決於你編寫函數的語言。一些像C這樣的語言是非常低級的,將每個函數調用或語句翻譯成特定的彙編語句。如果您確實使用C,則可以使用內聯彙編替換您的函數以提高性能。

其他高級語言可能會將每個語句轉換爲宏程序或程序集端的其他更復雜的調用。某些優化(如尾遞歸,循環展開等)可以很容易地在源端實現,但其他(如更有效地使用寄存器文件)可能是不可能的(再次,取決於您使用的語言和編譯器使用)。

1

很難說修改後的程序集與生成未修改版本的源代碼之間有任何關係。它肯定會混淆調試工具:寄存器內容將不再匹配它們應該對應的源變量。

數據包處理代碼中有許多地方我已經檢查了生成的程序集並返回來更改原始源代碼以改進結果。重新安排源可以減少分支的數量,__attribute__和編譯器參數可以對齊分支點和函數以減少I $未命中。在絕望的情況下,可以使用一個小內聯彙編,以便二進制文件仍然可以從源代碼編譯。

1

你可以嘗試的東西是將你的原始函數分離到它自己的文件中,並提供一個make規則從那裏構建彙編程序。然後使用改進後的版本更新彙編程序文件,並提供一個make規則以從彙編程序文件構建一個目標文件。然後更改您的鏈接規則以包含該對象文件。

如果您只更改過彙編程序文件,那將繼續使用。如果您更改原始的高級語言文件,彙編程序文件將被重新構建,而目標文件則由新版本(未改進版本)構建。

這給你兩者之間的關係;您可能希望在更高級別語言文件的頂部添加警告註釋以警告有關行爲。如果你在這裏犯了一個錯誤,使用某種形式的VCS將使你能夠恢復改進的彙編文件。

1

如果你正在寫在Visual C++的本機應用程序編譯,有兩種方法:

  1. 使用__asm { }塊,並在那裏寫你的彙編。
  2. MASM彙編程序中編寫函數,彙編爲.obj,並將其作爲靜態庫鏈接。在您的C/C++代碼中,用extern "C"聲明聲明該函數。

其他C/C++編譯器有類似的方法。

1

在這種情況下,通常有兩種選擇:優化代碼或重寫編譯器。我看不出在哪裏打破源代碼和操作系統之間的聯繫永遠是正確的解決方案。