我想調查一個性能問題,其中一個應用程序在64位服務器上運行時運行速度很慢,而在同一臺機器上運行速度很快,或者在其他任何位置運行64位。哪個JIT正在運行我的應用程序
我已經看到這可能與正在使用的JIT編譯器有關。有沒有一種方法可以告訴我用哪個JIT編譯器來運行我的應用程序?我想看看它是不是在服務器上的64位版本工作正常的其他計算機上的不同。
我想調查一個性能問題,其中一個應用程序在64位服務器上運行時運行速度很慢,而在同一臺機器上運行速度很快,或者在其他任何位置運行64位。哪個JIT正在運行我的應用程序
我已經看到這可能與正在使用的JIT編譯器有關。有沒有一種方法可以告訴我用哪個JIT編譯器來運行我的應用程序?我想看看它是不是在服務器上的64位版本工作正常的其他計算機上的不同。
JIT版本
您可以按照漢斯的步驟來驗證RyuJIT加載到你的應用程序。 [2]
使用調試器來確保您有新版本。首先使用Explorer瀏覽運行時目錄,導航到C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319。你會在那裏發現兩個抖動,clrjit.dll是基於Ryujit項目的新的抖動,compatjit.dll是傳統的x64抖動。
項目>屬性>調試>勾選「啓用本地代碼調試選項」。使用「構建」選項卡並確保已刪除抖動強制,「首選32位」選項必須取消選中,「平臺目標」必須設置爲AnyCPU。並使用「應用程序」選項卡選擇框架目標。
使用調試>步入開始調試。調試> Windows>模塊顯示已加載模塊的列表。找到該列表中的抖動DLL,單擊「名稱」列標題按名稱排序。如果您看到compatjit.dll,那麼您正在使用傳統抖動。請注意,你總是會看到clrjit.dll,它們在使用傳統抖動時都會被加載。
[2] https://stackoverflow.com/a/31534544/102351
JIT架構
可以確定通過檢查運行的應用程序是否是一個64位的過程或不使用JIT的體系結構。
Environment.Is64BitProcess
https://msdn.microsoft.com/en-us/library/system.environment.is64bitprocess.aspx
該屬性被實現爲直接真/假mscorlib程序的64位和32位版本內分別返回。 [1]
你認爲「JIT」是什麼意思? – CodeCaster
基於他們的問題,他們問如何檢測x86或x64 JIT是否在他們的過程中使用。 Environment.Is64BitProcess屬性可以確定這一點,因爲它根據加載的mscorlib的體系結構被硬編碼爲真/假。 – Scorpion
不,OP宣稱應用程序在64位的所有服務器上運行都很快,因此他們想要了解該服務器上的JIT編譯器版本是否有所不同。你的回答也使得它聽起來像「JIT」等於「bitness」。 – CodeCaster
使用JIT性能計數器(https://msdn.microsoft.com/en-us/library/w8f5kw2e(v=vs.110).aspx#jit)被即時編譯代碼時進行監控。
您可以使用ngen(https://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.110).aspx)通過刪除對JIT代碼的需要來提高應用程序啓動時間 - ngen將程序集預編譯爲本機映像。
我懷疑你的性能問題來自JIT編譯器,更好地檢查你的代碼並嘗試重構它,並且不要浪費時間。 – mybirthname
不知道如何判斷哪一個是活動的,但你應該明確地嘗試[啓用/禁用RyuJIT](https://github.com/Microsoft/dotnet/blob/master/docs/testing-with-ryujit.md)並比較性能。它有一些錯誤,所以它可能會有性能問題。 –
這可能是一個有用的鏈接。[.NET運行時(CLR),JIT編譯器位於何處?](http://stackoverflow.com/questions/30802270/where-exactly-is-net-runtime-clr-jit-compiler-located)你可以看看在每臺服務器上的DLL文件版本上查看是否有差異。我不確定這是不是RyuJIT 64位編譯器的位置。 –