我通常使用C++和Rust等零成本抽象概念進行編程。C#是否具有零成本抽象?
目前我在使用C#語言的一個項目我工作。所以我想知道是否可以安全地創建抽象和更高級別的代碼而不影響性能。
這有可能在C#或性能關鍵代碼,我應該只是做低級別代碼可能嗎?作爲我在代碼中遇到的一個例子(不要太在意這個例子,我的問題是更高級的),我需要一個函數來返回多個值,爲此,我的第一個方法是使用元組,所以這樣的事情:
public (int, int, float) Function();
或摘要本解析成一個結構:
public struct Abstraction { int value1; int value2; float value3; };
public Abstraction Function();
我預料的是,編譯器將優化Tuple
或Abstraction struct
路程,只需使用原始值直接。但我發現的是,寫的用out
參數代碼將提高性能:
public void Function(out int value1, out int value2, out float value3);
我猜測的原因是因爲在out
功能,沒有Tuple
或Abstraction struct
創作。
與out
功能版本的問題是,我真的很討厭用參數,返回值,因爲它似乎更像是一個破解到語言限制。
那麼,到底我不知道如果我只是沒有使用正確的配置,因此JIT可以用零成本的抽象或者這根本就是不可能的,或者在C#中不能保證。
這看起來像是微型優化。使用一種方法而不使用另一種方法的性能成本可能可以忽略不計,並且與算法本身的整體性能相比可能無關緊要。 –
結構本身就是一個抽象。如果方法不能內聯,那麼抖動會將方法重寫爲void Function(out Abstraction retval)。就像C或C++編譯器必須這樣做。有很多糟糕的基準測試,這是非常快速的代碼,很難衡量。 –