流畅的界面是否会显着影响.NET应用程序的运行时性能?

sta*_*ica 9 .net performance garbage-collection fluent-interface runtime

我目前正忙着为现有技术实现流畅的界面,这将允许类似于以下代码段的代码:

using (var directory = Open.Directory(@"path\to\some\directory"))
{
    using (var file = Open.File("foobar.html").In(directory))
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

为了实现这样的构造,需要使用类来累积参数并将它们传递给其他对象.例如,要实现Open.File(...).In(...)构造,您需要两个类:

// handles 'Open.XXX':
public static class OpenPhrase
{
    // handles 'Open.File(XXX)':
    public static OpenFilePhrase File(string filename)
    {
        return new OpenFilePhrase(filename);
    }

    // handles 'Open.Directory(XXX)':
    public static DirectoryObject Directory(string path)
    {
        // ...
    }
}

// handles 'Open.File(XXX).XXX':
public class OpenFilePhrase
{
    internal OpenFilePhrase(string filename)
    {
        _filename = filename
    }

    // handles 'Open.File(XXX).In(XXX):
    public FileObject In(DirectoryObject directory)
    {
        // ...
    }

    private readonly string _filename;
}
Run Code Online (Sandbox Code Playgroud)

也就是说,诸如初始示例之类的组成部分语句越多,则需要创建的对象越多,以便将参数传递给链中的后续对象,直到实际语句最终可以执行为止.

题:

我对一些观点感兴趣:使用上述技术实现的流畅界面是否会显着影响使用它的应用程序的运行时性能?在运行时性能方面,我指的速度和内存使用方面.

请记住,只需要非常简短的时间跨度就可以创建大量临时的,参数保存对象,我认为这可能会给垃圾收集器带来一定的压力.

如果您认为会对性能产生重大影响,您是否知道实现流畅接口的更好方法?

Tho*_*nin 5

一般来说,具有非常小的生命周期的对象正是GC最有效处理的对象类型,因为它们中的大多数将在下一个次要集合运行时死亡 - 并且在任何体面的GC实现中,成本次要集合与活动对象的总大小成比例.因此,短期对象的成本非常低,并且它们的分配意味着仅向上撞击指针,这很快.

所以我想说:可能没有显着的性能影响.