2017-09-02 169 views
2

我通常使用C++和Rust等零成本抽象概念進行編程。C#是否具有零成本抽象?

目前我在使用C#語言的一個項目我工作。所以我想知道是否可以安全地創建抽象和更高級別的代碼而不影響性能。

這有可能在C#或性能關鍵代碼,我應該只是做低級別代碼可能嗎?作爲我在代碼中遇到的一個例子(不要太在意這個例子,我的問題是更高級的),我需要一個函數來返回多個值,爲此,我的第一個方法是使用元組,所以這樣的事情:

public (int, int, float) Function(); 

或摘要本解析成一個結構:

public struct Abstraction { int value1; int value2; float value3; }; 

public Abstraction Function(); 

我預料的是,編譯器將優化TupleAbstraction struct路程,只需使用原始值直接。但我發現的是,寫的用out參數代碼將提高性能:

public void Function(out int value1, out int value2, out float value3); 

我猜測的原因是因爲在out功能,沒有TupleAbstraction struct創作。

out功能版本的問題是,我真的很討厭用參數,返回值,因爲它似乎更像是一個破解到語言限制。

那麼,到底我不知道如果我只是沒有使用正確的配置,因此JIT可以用零成本的抽象或者這根本就是不可能的,或者在C#中不能保證。

+0

這看起來像是微型優化。使用一種方法而不使用另一種方法的性能成本可能可以忽略不計,並且與算法本身的整體性能相比可能無關緊要。 –

+1

結構本身就是一個抽象。如果方法不能內聯,那麼抖動會將方法重寫爲void Function(out Abstraction retval)。就像C或C++編譯器必須這樣做。有很多糟糕的基準測試,這是非常快速的代碼,很難衡量。 –

回答

1

當你返回的東西,你總是創建一個新的對象 - 你完全保存這一步時,只是工作「到位」與您out參數。然後,你有你的編譯器不能簡單優化的東西 - 我不得不告訴你一些關於C中嚴格的別名規則,但我不知道C#足以知道類似的東西是否適用於這裏。

所以,一般地,創建元組或Abstraction類型的對象是不可優化了。您明確指定要返回該類型的對象,以便該對象必須由該函數的「常規」編譯創建。你可以說,編譯器知道在Function被稱爲背景和可以推斷,它是確定不生成對象,而是直接工作,就好像這些是參考你要以後分配的Abstraction領域的事情,但在這裏重疊規則可能會變得非常複雜,而且這通常在邏輯上是不可能的。

相關問題