之前看到許多網友認爲靜態方法要比實例方法在執行效率上要快一些,當初不敢苟同。本身親自試了一把,發現靜態方法確實要快一些。安全
想要比較靜態方法與非靜態方法的執行效率,須要對CLR在調用靜態方法與非靜態方法時的不一樣之處要有一個瞭解。工具
靜態方法是與類相關聯的,CLR在調用一個靜態方法時須要作的事情就是找到定義該方法的類型便可實現調用;而在調用非靜態方法時,爲了保證運行安全,CLR會對咱們的源代碼進行驗證並額外的生成一些IL中間代碼來確保運行安全,因此在調用一個非靜態方法時,CLR首先是斷定被調用對象是否爲NULL,若是爲NULL,則引起一個異常,反之,則根據對象推薦出其類型,最後實現調用。能夠看出來,在調用靜態方法來非靜態方法時,後者比前者多作了一些工做,這將形成性能上的損失。因此,靜態方法在執行效率上可能要比非靜態方法要好一些。IL中能夠看到非靜態方法執行的是callvirt 指令:性能
CLR via C#的解釋:調用一個靜態方法時,CLR會定位與定義靜態方法的類型對應的類型對象。而後,JIT編譯器在類型對象的方法表中查找與被調用的方法對應的記錄項,對方法進行JIT編譯(若是須要的話),再調用JIT編譯的代碼。過程圖以下:對象
通常狀況下聲明靜態方法的類大可能是工具類,而且這些靜態方法不須要訪問類型中的非靜態字段和事件,也就是說靜態方法與該類型中的非靜態字段和事件不具備邏輯上的關聯性。若是一個方法聲明爲靜態方法,也意味着不能被重寫,該方法失去面向對象的擴展和多態的特性。blog
總結:靜態方法與實例方法在性能和佔用內存上沒有明顯的區別,是否聲明爲靜態方法須要從類型的非靜態字段、事件、面向對象擴展和多態這三方面來考慮。事件