[英]Question about c# optimizer
如果我寫:
SomeType simpleName = classWithLongName.otherLongName;
然后使用“ simpleName”代替“ classWithLongName.otherLongName”,這會以任何方式(例如性能方面)更改程序嗎?
編譯器對此做了什么? 是否在我使用“ simpleName”的任何地方復制並粘貼“ classWithLongName.otherLongName”。
不,C#編譯器不會simpleName
“ simpleName
”的調用轉換為與復制和粘貼“ classWithLongName.otherLongName
”相同。 區別可能是深刻的,也可能只是語義上的區別,但是您正在做的是將classWithLongName.otherLongName中的值分配給simpleName。 該類型是值類型還是引用類型將確定操作該值時會發生什么以及將發生什么,但是在執行操作時您不會創建函數指針或委托。
除了說不會產生負面影響外,它是否會真正影響性能還不能在這里得到回答。 我們不能說它是否會產生積極的影響,因為這取決於您調用classWithLongName.otherLongName
時實際發生的情況。 如果這是一個昂貴的操作,則可以使其速度更快,但是缺點是,如果將其值緩存在simpleName
,則后續調用classWithLongName.otherLongName
任何差異都不會反映出來。
這取決於“ otherLongName”的實際作用。 如果是屬性,則區別在於執行該屬性幾次或僅執行一次。 這可能會或可能不會在很大程度上改變程序的行為,具體取決於它在做什么。
僅當您始終鍵入“ classWithLongName.otherLongName
”時,如果編譯器知道該值在過程中不會更改,則僅允許其緩存並重新使用它。 但是,這種情況很少。
因此,如果“ classWithLongName.otherLongName
”確實執行了一些計算,通常可以通過按建議將其手動緩存在局部變量中來獲得更好的性能。 但是,請記住,您正在使用緩存的值,並且原始值或屬性的更改不會反映在緩存的值上。
但是,該名稱的長度僅是元數據,並且對運行時性能沒有任何影響,因為該名稱已在編譯期間解析為內部句柄。
這是關於實例或類的問題嗎?
例如
namespace MyCompany.MyApp.LongNamespaceName
{
public class MyClassWithALongName {
public SomeType AnInstanceProperty {get;set;}
public static SomeType AStaticProperty {get { ... }}
}
}
現在:
//this gets the static property
SomeType simpleName = MyClassWithALongName.AStaticProperty;
或者:
MyClassWithALongName anInstanceWithALongName = new MyClassWithALongName();
//this gets the instance property
SomeType simpleName = anInstanceWithALongName.AnInstanceProperty;
這些將以不同的方式表現。
不過,還有另一種情況,您可以為該類的實際名稱創建別名:
using simpleName = MyCompany.MyApp.LongNamespaceName.MyClassWithALongName;
...
simpleName anInstance = new simpleName ();
如果classWithLongName.otherLongName是屬性,則對simpleName的更改不會更改classWithLongName.otherLongName。
如果classWithLongName.otherLongName是值類型的公共數據成員(字段),則對simpleName的更改不會更改classWithLongName.otherLongName。
如果classWithLongName.otherLongName是引用類型的公共數據成員(字段),則更改為simpleName將更改classWithLongName.otherLongName。
假設您的類型是對象(引用)類型,那么simpleName將最終包含對classWithLongName.otherLongName返回的對象的引用 。 如果隨后要對該對象的屬性進行大量調用,則可能會提高性能,尤其是在otherLongName是屬性而不是字段的情況下。
您始終可以使其成為功能。
SomeType simpleName() { return classWithLongName.otherLongName; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.