我們正在爲高級編譯語言編寫一個字節碼,經過一些分析和優化後,很明顯,當前最大的性能開銷是我們使用的switch語句跳轉到字節碼的情況。標籤地址(MSVC)
我們調查了拔出每個案例標籤的地址並將其存儲在字節碼本身的流中,而不是我們通常打開的指令ID。如果我們這樣做了,我們可以跳過跳轉表,直接跳到當前正在執行的指令的代碼位置。這在GCC中非常有效,但是,MSVC似乎不支持這樣的功能。
我們試圖使用內聯彙編來獲取標籤的地址(並跳轉到它們),並且它可以工作,但是,使用內聯彙編會導致MSVC優化器避免整個函數。
有沒有辦法讓優化器仍然運行代碼?不幸的是,我們不能將內聯程序集提取到另一個函數中,而不是標籤所在的函數,因爲即使在內聯程序集中,也無法爲另一個函數引用標籤。任何想法或想法?非常感謝您的意見,謝謝!
您是否嘗試過函數指針? –
如何在字節碼中放置函數地址而不是標籤地址?然後,每個指令ID都有一個函數。除非你的獲取執行循環在你的大功能標籤中。 –
如果我使用每種情況下的函數,並使用函數指針而不是標籤地址,它將起作用。但是,我覺得函數調用的開銷會非常大,即使函數是微不足道的(無參數,不返回),也會使性能增益無效。我會嘗試一下,並感謝張貼。 – Trevor