Roslyn 启动时间慢

2024-01-02

我注意到 Roslyn 解析/编译的启动时间是相当大的一次性成本。编辑:我正在使用 Roslyn CTP MSI(程序集位于 GAC 中)。这是预期的吗?有什么解决方法吗?

运行下面的代码,执行 1 次迭代(约 3 秒)所需的时间与运行 300 次迭代(约 3 秒)所需的时间几乎相同。

[Test]
public void Test()
{
    var iters = 300;
    foreach (var i in Enumerable.Range(0, iters))
    {
        // Parse the source file using Roslyn
        SyntaxTree syntaxTree = SyntaxTree.ParseText(@"public class Foo" + i + @" { public void Exec() { } }");

        // Add all the references we need for the compilation
        var references = new List<MetadataReference>();
        references.Add(new MetadataFileReference(typeof(int).Assembly.Location));

        var compilationOptions = new CompilationOptions(outputKind: OutputKind.DynamicallyLinkedLibrary);

        // Note: using a fixed assembly name, which doesn't matter as long as we don't expect cross references of generated assemblies
        var compilation = Compilation.Create("SomeAssemblyName", compilationOptions, new[] {syntaxTree}, references);

        // Generate the assembly into a memory stream
        var memStream = new MemoryStream();

        // if we comment out from this line and down, the runtime drops to ~.5 seconds
        EmitResult emitResult = compilation.Emit(memStream);

        var asm = Assembly.Load(memStream.GetBuffer());
        var type = asm.GetTypes().Single(t => t.Name == "Foo" + i);
    }
}

我认为一个问题是使用内存流,相反,您应该尝试使用动态模块和 ModuleBuilder。总体而言,代码执行速度更快,但首次加载场景仍然较重。我自己对 Roslyn 还很陌生,所以我不确定为什么这更快,但这里是更改后的代码。

        var iters = 300;
        foreach (var i in Enumerable.Range(0, iters))
        {
            // Parse the source file using Roslyn
            SyntaxTree syntaxTree = SyntaxTree.ParseText(@"public class Foo" + i + @" { public void Exec() { } }");

            // Add all the references we need for the compilation
            var references = new List<MetadataReference>();
            references.Add(new MetadataFileReference(typeof(int).Assembly.Location));

            var compilationOptions = new CompilationOptions(outputKind: OutputKind.DynamicallyLinkedLibrary);

            // Note: using a fixed assembly name, which doesn't matter as long as we don't expect cross references of generated assemblies
            var compilation = Compilation.Create("SomeAssemblyName", compilationOptions, new[] { syntaxTree }, references);

            var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new System.Reflection.AssemblyName("CustomerA"),
            System.Reflection.Emit.AssemblyBuilderAccess.RunAndCollect);

            var moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule");

            System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
            watch.Start();

            // if we comment out from this line and down, the runtime drops to ~.5 seconds
            var emitResult = compilation.Emit(moduleBuilder);

            watch.Stop();

            System.Diagnostics.Debug.WriteLine(watch.ElapsedMilliseconds);

            if (emitResult.Diagnostics.LongCount() == 0)
            {
                var type = moduleBuilder.GetTypes().Single(t => t.Name == "Foo" + i);

                System.Diagnostics.Debug.Write(type != null);
            }
        }

通过使用这种技术,编译仅花费了 96 毫秒,在后续迭代中大约需要 3 - 15 毫秒。所以我认为你在第一个负载场景增加一些开销方面可能是正确的。

抱歉,我无法解释为什么它更快!我自己正在研究 Roslyn,今晚晚些时候我会做更多的挖掘,看看是否能找到 ModuleBuilder 通过内存流提供的更多证据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Roslyn 启动时间慢 的相关文章

  • 为什么我的 C#/pinvoke DeviceIoControl 调用返回 0 字节读取的垃圾数据?

    我有一个运行良好的非托管 C Windows 控制台应用程序 我想要它在 C 中 我已经为必要的 Kernel32 dll 符号完成了 DllImport 语句 StructLayout LayoutKind Sequential inte
  • 在 C++ 中,当我将值传递给函数时,它是否总是转换为适当的类型?

    如果我有一个像这样的函数void func size t x 我称该函数为func 5 5 立即转换为size t类型 这通常适用于所有类型吗 我问这个问题是因为我发誓我见过人们编写代码 他们做类似的事情func 5 0 将 5 作为双精度
  • 在 C++ 中,std::string::push_back() 的摊余复杂度是 O(1) 吗?

    我知道标准指定它适用于向量 但是字符串呢 是的 它是摊销常数时间 请参见第 716 页的表 101本文件的 http www open std org jtc1 sc22 wg21 docs papers 2012 n3485 pdf 表
  • 如何将异常对象序列化为 xml 字符串

    我想要类似的东西 try code here catch Exception ex stringXML Exception toXML 这样 stringXML 的值就是
  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • MVC 中的 Blazor:组件被渲染,但 @onclick 不起作用。连接问题

    我正在尝试在 net core 3 MVC 项目中使用 Blazor 我使用了一些教程来做到这一点 例如https fizzylogic nl 2019 08 18 integrating blazor in an existing asp
  • 有没有办法让我的程序用更少的代码运行?

    我为学校作业编写了以下代码 它编译并打印所有正确的消息 但出于我自己的好奇心 我想知道我的代码是否可以缩短并且仍然有效 我尝试了 signal 而不是 sigaction 但我听说 sigaction 比 signal 更受青睐 此外 此任
  • std::async 参数的生命周期是多少?

    看来函数的参数是通过std async分享未来的生活 include
  • 对无符号 8 位整数进行左移操作 [重复]

    这个问题在这里已经有答案了 我试图理解 C C 中的移位运算符 但它们给我带来了困难 我有一个无符号 8 位整数 初始化为一个值 例如 1 uint8 t x 1 根据我的理解 它在内存中的表示方式如下 0 0 0 0 0 0 0 1 现在
  • 如何实现可变虚拟成员函数

    所以我有这个功能 virtual void CallRemoteFunction const char pServerGameObjectId const char pFunctionName OVariant arg1 OVariant
  • Docker 不遵循构建目录中的符号链接

    我正在对一个应用程序进行 Docker 化 其中涉及通过 Clang 将二进制文件与其他 C 文件链接 我们维护二进制文件的符号链接版本 因为它们在整个代码库中使用 我的 Docker 构建目录包含整个代码库 包括源文件以及这些源文件的符号
  • C++ 虚拟关键字与重写函数

    我正在学习c 并且正在学习virtual关键字 我在互联网上搜索试图理解它但无济于事 我进入编辑器并做了以下实验 期望它打印两次基本消息 因为我的印象是需要 virtual 关键字来覆盖函数 然而 它打印出了两条不同的消息 有人可以向我解释
  • 不可能的事情发生了!这是什么意思?

    我遇到了一个有趣的运行时错误 我认为这是某种内存泄漏 我写了以下程序 C Code include
  • 函数中的重复参数检查

    我经常有调用层次结构 因为所有方法都需要相同的参数 如果我不想将它们放在实例级别 类的成员 那么我总是问我在每个方法中检查它们的有效性是否有意义 例如 public void MethodA object o if null o throw
  • 如何在 C 预处理器中可靠地检测 Mac OS X、iOS、Linux、Windows? [复制]

    这个问题在这里已经有答案了 如果有一些跨平台 C C 代码需要在 Mac OS X iOS Linux Windows 上编译 我如何在预处理器过程中可靠地检测到它们 大多数编译器都使用预定义的宏 您可以找到列表here http sour
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • 如何明智地解释这个编译器警告?

    当我执行这段代码时question https stackoverflow com a 51056490 2411320 我收到这个警告 warning format d expects argument of type int but a
  • C 中函数“fgets”的参数太少

    每当我编译这个错误时 我都会收到该错误 但我不知道为什么 我直接从书上抄袭这个 有人可以帮忙吗 include
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • File.Move 的原子性

    我想将目录中的文件重命名为原子事务 该文件不会更改目录 该路径作为 NTFS 文件系统的 UNC 路径提供 可能位于服务器 03 或 08 上 File Move 对于这些目的来说是原子的吗 例如 它要么成功完成 要么失败 以使原始文件仍然

随机推荐

  • 将表格与页面中心对齐

    我只想将表格放在页面中间 任何帮助都会很棒
  • 使用 Ruby SDK 从 SNS 接收消息时的 AWS SQS JSON 格式

    我有一个订阅 SNS 主题的 SQS 队列 当我向该主题发布新通知时 我使用以下代码 在 Sinatra 应用程序中 jsonMessage announcement gt first name gt results first name
  • 开始触摸次数不等于完成触摸次数

    我有以下代码用于测试目的 void touchesBegan NSSet touches withEvent UIEvent event self customTouchHandler touches void touchesEnded N
  • SAMLException:NameID 元素必须作为响应消息中主题的一部分出现,请在 IDP 配置中启用它

    我在用春天萨姆执行 在 WebSSOProfileConsumerImpl 类中 我可以找到以下代码行 用于检查 nameIdSAML 响应的断言 NameID nameID if subject getEncryptedID null A
  • SwiftUI - NavigationView 中的内存泄漏

    我正在尝试向模态呈现的视图的导航栏添加一个关闭按钮 然而 解雇后 我的视图模型deinit方法从未被调用 我发现问题在于它捕获的位置self in 导航栏项的 我不能只通过一个weak self in 导航栏项的动作 因为 View 是一个
  • 嵌套方法调用与一次性变量

    嵌套方法调用或使用一次性变量时的最佳实践是什么 你不应该使用一次性变量吗 example persistentStoreCoordinator addPersistentStoreWithType NSXMLStoreType config
  • C 库必须具有 .lib 扩展名

    我不懂C 但需要与项目中的一些C文件进行交互 我注意到有些文件有 lib扩展 而其他的 也应该是库 有 c and h文件仅位于大文件夹中 这些库有什么区别 Are the c and h文件夹也是库 Is the lib为图书馆和那些这样
  • Tabify 3 QDockWidget

    如何在 QMainWindow 中为 3 个小部件创建选项卡式停靠栏 我正在使用下面的代码 widget1 new QDockWidget this widget1 gt setObjectName name1 addDockWidget
  • 为什么 webgl 程序的着色器必须位于 html 文件中?

    我看到以下问题 有人询问如何从 html 中删除着色器 WebGL 是否有替代在 HTML 中嵌入着色器的方法 https stackoverflow com questions 5878703 webgl is there an alte
  • Django 与附加字段的多对多关系

    我想在自动创建的 ManyToMany 连接表中存储一些附加信息 我将如何在 Django 中做到这一点 就我而言 我有两个表 员工 和 项目 我想要存储的是每个项目中每个员工每小时的工作收入是多少 因为这些值并不相同 那么 我该怎么做呢
  • 如何使用 PHP + HTML 在超链接中传递数据库值

    我的数据库中有一个名为 Artists 的表 它包含两个乐队 我想做的是能够使用超链接单击乐队名称 将该乐队名称发送到另一个 php 页面进行处理 我的超链接语法抛出错误 query SELECT FROM artists result m
  • 在mongo shell中访问shell环境

    有没有办法在 mongo shell 中访问 shell 环境变量 在nodejs中 它可以访问脚本中的环境变量 如下所示 var uri process env MONGOLAB URI 我正在 mongo 脚本中寻找相同的方式 您可以使
  • 有断头台限制的相同矩形内矩形打包算法的提示吗?

    我的任务是为一位熟人构建一个程序 该程序计算出将书页适合打印和剪切的大纸张的最佳方式 在实践中 这意味着我需要找到在给定矩形 打印纸 内排列具有相同尺寸 页面 的矩形的最佳方法 以便可以使用断头台切割来分离所有页面而不破坏任何页面 如果你们
  • QTableView 格式化单独的行和列

    也许我要问的问题太基本了 以至于我在某个地方错过了它 但我用谷歌搜索了各种各样的东西 但我无法找到答案 我有以下表视图 来自 SQLite 表 body new QSqlTableModel parent data gt m db body
  • return 语句何时需要显式移动?

    In a 对另一个问题的评论 https stackoverflow com q 17473753 321013乔纳森 韦克利回应我的声明 您永远不需要显式移动局部变量函数返回 价值 这是隐式的移动 gt 永远不要说永远 如果局部变量 您需
  • Roboguice 全球活动经理

    我在 Android 应用程序中使用 RoboGuice 3 0 1 和 RoboBlender 我想要一个全局事件管理器 并注意到 RG3 0 已经有了它 如下所述 https github com roboguice roboguice
  • iPhone 操作系统是 64 位还是 32 位?

    有人知道 iPhone 操作系统是基于 32 位还是 64 位架构吗 ARM http en wikipedia org wiki ARM architecture是32位架构 我相信iPhone和iPhone 3G使用omap2 它使用A
  • 通过比较 4 个不同的行来提取数据

    表数据如下 需要提取满足以下条件的记录 这里值 值2 值1 Value of two days back data should be gt 2 Value of last day data is lt 0 Value of next da
  • groupby pandas:插入列的索引与框架索引不兼容

    我已经对 pandas 执行了 groupby 我想应用一个复杂的函数 该函数需要多个输入 并给出一个 pandas Series 作为输出 我想将其刻录在原始数据框中 这对我来说是一个已知的过程 并且效果很好 除了最后一个案例 我对无法完
  • Roslyn 启动时间慢

    我注意到 Roslyn 解析 编译的启动时间是相当大的一次性成本 编辑 我正在使用 Roslyn CTP MSI 程序集位于 GAC 中 这是预期的吗 有什么解决方法吗 运行下面的代码 执行 1 次迭代 约 3 秒 所需的时间与运行 300