为啥大括号在 C# 代码上需要时间?

Posted

技术标签:

【中文标题】为啥大括号在 C# 代码上需要时间?【英文标题】:Why does braces take time on C# code?为什么大括号在 C# 代码上需要时间? 【发布时间】:2014-06-02 06:51:53 【问题描述】:

我使用的是 Ants Performance Profiler 8.5,当我看到每行代码运行的时间时,我注意到大括号也需要时间。

这是一张图片,你可以在大括号的左边看到以毫秒为单位的时间:

有时我会得到更多的时间,比如 5 毫秒...

这是为什么呢?是垃圾回收吗?

【问题讨论】:

我认为您误读了它...返回需要 0 毫秒?虽然它可能是垃圾收集(用于临时 var 声明),但它看起来更有可能是时间偏移 文档怎么说?我只能猜测它会在堆栈上处理参数,在堆上准备本地,最后处理输出参数和清理? 分析器只能测量从 C# 代码生成的机器代码所花费的时间。从机器代码到 C# 代码的映射并不总是完美的。特别是当您像往常一样分析优化代码时。在花括号处,为方法设置堆栈框架并再次将其拆除是有开销的。这最多需要几纳秒,乘以方法被调用的次数。测量 5 毫秒是过度的,应该被视为“实验错误”。 @Hans 这听起来像是对我的回答。 这是一个提示,我无法解释 5 毫秒。 【参考方案1】:

定义方法时,编译器知道该方法范围内的参数集,称为maxstack。这暗示了为该方法分配的内存量。

可能是额外时间的来源 - CLR 分配内存。

添加更多大括号实际上并没有向maxstack 添加更多参数。它涵盖了整个方法。作用域更像是一个逻辑分组,而不是由 CLR 实现以释放内存。

关于您关于 GC 的问题,我认为这不是问题的根本原因。 GC 在需要时由单独的线程运行。 可能是 GC,但我严重怀疑你的情况。

【讨论】:

以上是关于为啥大括号在 C# 代码上需要时间?的主要内容,如果未能解决你的问题,请参考以下文章

如果没有大括号的代码块,C# 是不是支持?

为啥 9 之后的 bash 命令行参数需要大括号?

反正有没有让 VS Code 在 C# 的新行上自动格式化大括号?

c#不带大括号的记录

编写高质量代码改善C#程序的157个建议——建议141:不知道该不该用大括号时,就用

为啥在使用大括号初始值设定项列表时首选 std::initializer_list 构造函数?