簡體   English   中英

C#對Int32文字到浮點數的性能損失

[英]C# Performance penalty for Int32 literals to floats

在c#中,您可以將數字文字定義為int或double

    Double var1 = 56.1;
    int var2 = 51;

這些是文字分配的默認類型。 但是,我正在使用的游戲引擎使用浮點數進行位置,旋轉等。當浮點數被賦值為文字雙float varFloat = 75.4; ,即float varFloat = 75.4; 編譯器拋出一個錯誤,說雙文字需要是一個浮點數,這是正確的。 因此,需要將雙文字轉換為浮動,即。 float varFloat = 75.4f; 但是,當給定int文字時,int會隱式轉換為float。 也就是說,

    float varFloat = 44; // This is fine.

我的問題是編譯器是否足夠聰明才能意識到44應該是float字面值? 如果不是,這意味着每次訪問文字時,它也會執行轉換。 在大多數情況下,這無關緊要。 但是對於高性能代碼,如果整個地方使用整數而不是浮點數,它可能會成為一個問題(即使它是一個小問題)。 據我所知,沒有辦法將這些文字更改為浮點數而不經過源代碼行,而這些源代碼實際上根本沒有花費時間。

那么,編譯器是否將int文字轉換為float文字? 如果沒有,除了試圖避免它之外,還可以做些什么呢?

答案是肯定的。 知道這一點很聰明。

這是一個反匯編的IL(由ILSpy提供 )一個簡單的程序,它具有這樣的任務。 從ldc.r4指令可以看出,沒有發生轉換:

.method private hidebysig static 
    void Main (
        string[] args
    ) cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 8 (0x8)
    .maxstack 1
    .entrypoint
    .locals init (
        [0] float32 x
    )

    IL_0000: nop
    IL_0001: ldc.r4 44
    IL_0006: stloc.0
    IL_0007: ret
} // end of method Program::Main

float比“double”小“

當您嘗試將float轉換為double時,可能會失去精度

看到這個: C:將double轉換為float,保持小數點精度

關於C#也是如此

當你寫float x = 5; 編譯器將在編譯時將其轉換為float x = 5.0;

沒有性能問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM