C# 使用可空结构是否可以提高性能?

C# 使用可空结构是否可以提高性能?,c#,performance,struct,garbage-collection,C#,Performance,Struct,Garbage Collection,我的想法如下: 既然结构可以提高GC性能,而且Nullable本身就是一个结构,那么在性能(GC性能或总体性能)方面,使用一个Nullable结构而不是类会更好吗 有人有这方面的经验吗 编辑: 例如:我在考虑为方法调用创建一个选项类/结构:ConvertToPdf(…,MyType options)。所以,不要用很多方法或类似的东西来构造超大结构。不 structs。。作为值类型的基础,应保持较小。类通常不会保持很小,因此可以用类的所有用法替换struct。。实际上,您将创建较慢的运行时速度。。

我的想法如下:

既然结构可以提高GC性能,而且
Nullable
本身就是一个结构,那么在性能(GC性能或总体性能)方面,使用一个Nullable结构而不是类会更好吗

有人有这方面的经验吗

编辑:

例如:我在考虑为方法调用创建一个选项类/结构:
ConvertToPdf(…,MyType options)
。所以,不要用很多方法或类似的东西来构造超大结构。

structs
。。作为值类型的基础,应保持较小。类通常不会保持很小,因此可以用类的所有用法替换
struct
。。实际上,您将创建较慢的运行时速度。。因为值类型是完整复制的。


structs
。。作为值类型的基础,应保持较小。类通常不会保持很小,因此可以用类的所有用法替换
struct
。。实际上,您将创建较慢的运行时速度。。因为值类型是完整复制的。

过早视错觉!-考虑到这一点,因为您不会像在类中包装它那样直接获得装箱,所以可以使其为null。当然,假设结构的使用是适当的——您确实倾向于看到很多类只有很少的成员,那么这些类可能是一个目标。但是你不想像这样验光,除非你知道你需要,因为你只是一个凡人。

过早验光!-考虑到这一点,因为您不会像在类中包装它那样直接获得装箱,所以可以使其为null。当然,假设结构的使用是适当的——您确实倾向于看到很多类只有很少的成员,那么这些类可能是一个目标。但是,除非你知道你需要这样做,否则你不想这样做,因为你只是一个凡人。

结构在语义上等同于一堆用胶带粘在一起的变量。如果要创建一个结构

public struct MaybeValid<T>
{
  public T Value;
  public bool IsValid;
}
public结构可能有效
{
公共价值观;
公共布尔是有效的;
}

那么
变量的
字段可能是有效的
,与
T
类型的变量一样有效。然而,框架的
Nullable
并不是这样定义的。因此,通常需要先将
可为null的
复制到其他变量,然后才能对其执行任何操作。使用
Nullable
时需要额外的复制层,这意味着使用它的代码通常不会像使用其他类型的代码那样高效。

结构在语义上等同于用胶带粘在一起的一组变量。如果要创建一个结构

public struct MaybeValid<T>
{
  public T Value;
  public bool IsValid;
}
public结构可能有效
{
公共价值观;
公共布尔是有效的;
}

那么
变量的
字段可能是有效的
,与
T
类型的变量一样有效。然而,框架的
Nullable
并不是这样定义的。因此,通常需要先将
可为null的
复制到其他变量,然后才能对其执行任何操作。使用
Nullable
时需要额外的复制层,这意味着使用它的代码通常不会像使用其他类型的代码那样高效。

您是否有一个实际的性能问题,可以证明一个Nullable结构可以提高性能?如果不是的话,你可能应该坚持“当事物由其值定义时使用结构/值类型”不,这只是我的一个查询。它突然出现在我的脑海中,不存储在堆上的可能性并不是值类型和引用类型之间的唯一区别。还有很多其他的事情你必须考虑。我在这里列出了很多:通过对编程语言的每个部分进行微观分析,确定每个部分的“最佳”选项,然后根据这些选项编写所有代码,并不能编写高性能代码。您可以通过编写清晰易读的代码并设置实际的性能目标来编写性能代码。然后,检查代码是否符合目标。如果成功了,很好,你就完了。如果没有,那么您就开始从整体上分析代码,并确定实际的瓶颈在哪里以及如何解决它们。您是否有实际的性能问题,可以证明一个可为空的结构可以提高性能?如果不是的话,你可能应该坚持“当事物由其值定义时使用结构/值类型”不,这只是我的一个查询。它突然出现在我的脑海中,不存储在堆上的可能性并不是值类型和引用类型之间的唯一区别。还有很多其他的事情你必须考虑。我在这里列出了很多:通过对编程语言的每个部分进行微观分析,确定每个部分的“最佳”选项,然后根据这些选项编写所有代码,并不能编写高性能代码。您可以通过编写清晰易读的代码并设置实际的性能目标来编写性能代码。然后,检查代码是否符合目标。如果成功了,很好,你就完了。如果没有,那么您就开始从整体上分析代码,并确定实际的瓶颈在哪里以及如何修复它们。您是对的。但是,如果我们假设它们不是巨大的结构,也没有太多的复制?例如,我正在考虑为一个方法调用创建一个选项类/结构:
ConvertToPdf(…,MyType options)
@user2173353一个小的并且经常被实例化的类型可能是值类型的一个很好的候选者。但是1)不要担心这一点,除非性能非常关键;2)如果您决定尝试一下,请测量一下,看看是否有任何实际的性能提升!!真的