2015-11-05 23 views
0

我正在爲.NET平臺編寫一個非常基本的編譯器,並想知道我的常量實現。哪個更快:ldc.i4/ldstr或ldloc?

在我的編譯器中,使用常量有望替代ldloc操作。

如果常量theAge(18)和theName(巴里)實際上變量中,IL可能是這樣的:

ldstr "Your name is " 
ldloc theName 
concat     //Example operation for concatenating 
ldstr " and you are " 
concat 
ldloc theAge 
tostring    //Example operation for changing the variable to a string 
concat 

但如果我實現了常量:

ldstr "Your name is " 
ldstr "Barry" 
concat 
ldstr " and you are " 
concat 
ldc.i4 18 
tostring 
concat 

這是更快:ldc.i4/ldstr或ldloc?或者,將常量存儲爲變量會更好嗎?

+2

在初始開發期間擔心這些細節還爲時過早,恕我直言。一旦你有一個實際上可以在任何方面工作的編譯器,你可以回頭嘗試替代代碼生成序列,如果你認爲它們是合理的,就進行修改。 –

+0

嗯,你正在跳過基本的東西,在你使用LDLOC之前,你首先必須初始化變量。也許與LDSTR。 MSIL和處理器上運行的機器代碼之間只有很弱的聯繫,但是一個非常基本的粗略措施是更多的MSIL需要更多時間來執行。如果變量實際上是用LDSTR初始化的,那麼它並不重要,抖動優化器可以輕易地將其刪除。 –

回答

2
  1. 我同意@ 500的評論:這是一個微優化,你應該只在你的編譯器工作之後擔心這個。然後,您應該使用基準來找出哪些選項更快,以及多少,性能難以預測。
  2. 如果我試圖預測這一點(儘管我自己的警告如上),我會說直接加載常量會更快(如果差異實際上是可測量的)。

    這是因爲在ldc選項中,CPU將讀取該指令,然後可以直接將該值寫入寄存器。與ldloc,它也會從堆棧中加載值。與ldstr的情況類似。

    但是,如果在局部變量的值是有效恆定的,JIT編譯器可以優化ldloc相同的代碼ldc,所以可能沒有任何差別。 (但我不知道常見的JIT編譯器是否可以這樣做。)