与内联函数一起使用时对象表达式的开销
Overhead of Object Expressions when used with inline function
我喜欢接受的答案中使用的想法 here。我对它的理解是,它是一种将接口用作方法参数而无需实现接口的优雅方式。 SRTP 用于鸭子类型以采用一种类型(原谅 OO 术语,很高兴学习 FP 类型)到接口:
let inline namedModel< ^T when ^T : (member Name : string)> (model:^T)=
{ new INamed with
member x.Name =
(^T : (member Name : string) model) }
在我从接受的答案中获取的上面代码中,让我感到困惑的是内联方法的运行时行为。
在我看来,每次调用此方法时,它都会创建 return INamed 的新实现。正如我在链接问题的评论中所问的那样,如果多次调用 namedModel
方法,这不会对垃圾收集器造成很大压力吗?
我真的很想使用这种方法,但我不敢继续,以免我对其内存消耗的理解是正确的。
是的,它会在每次调用时创建一个新对象。
但请记住优化的第一条规则:先测量,再优化。您确定在每次调用时创建一个对象在您的情况下都会非常昂贵吗?你量过吗?
另一件要记住的事情是,在普通代码中,您不断地创建和丢弃对象,通常甚至没有想到它。 .NET 垃圾收集器专为处理此问题而设计。
我喜欢接受的答案中使用的想法 here。我对它的理解是,它是一种将接口用作方法参数而无需实现接口的优雅方式。 SRTP 用于鸭子类型以采用一种类型(原谅 OO 术语,很高兴学习 FP 类型)到接口:
let inline namedModel< ^T when ^T : (member Name : string)> (model:^T)=
{ new INamed with
member x.Name =
(^T : (member Name : string) model) }
在我从接受的答案中获取的上面代码中,让我感到困惑的是内联方法的运行时行为。
在我看来,每次调用此方法时,它都会创建 return INamed 的新实现。正如我在链接问题的评论中所问的那样,如果多次调用 namedModel
方法,这不会对垃圾收集器造成很大压力吗?
我真的很想使用这种方法,但我不敢继续,以免我对其内存消耗的理解是正确的。
是的,它会在每次调用时创建一个新对象。
但请记住优化的第一条规则:先测量,再优化。您确定在每次调用时创建一个对象在您的情况下都会非常昂贵吗?你量过吗?
另一件要记住的事情是,在普通代码中,您不断地创建和丢弃对象,通常甚至没有想到它。 .NET 垃圾收集器专为处理此问题而设计。