我通常使用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++编译器必须这样做。有很多糟糕的基准测试,这是非常快速的代码,很难衡量。 –