Roslyn 没有优化多个增量是否有原因?

2024-01-03

我想看看如何Roslyn优化以下代码片段:

code

public int F(int n) {
    ++n;       
    ++n;       
    ++n;       
    ++n;       

    return n;
}              

asm

C.F(Int32)
    L0000: inc edx
    L0002: inc edx
    L0004: inc edx
    L0006: inc edx
    L0008: mov eax, edx
    L000a: ret

Question

为什么 Roslyn 不像 MSVC 这样的提前 C 编译器那样对其进行优化?4 x INC速度较慢(4 个周期延迟 vs. 1 个周期延迟,即使假设 mov 消除,并且比吞吐量所需的微指令多 4 个;https://agner.org/optimize/ https://agner.org/optimize/).

C它的“等价物”:

int
f(void *dummy_this, int n) {
        ++n;        
        ++n;        
        ++n;        
        ++n;        

        return n;
}

asm来自 MSVC 或 GCC__attribute__((ms_abi))使用与 C# asm 相同的 Windows x64 调用约定:https://godbolt.org/z/sK6h7KKcn https://godbolt.org/z/sK6h7KKcn

f:
        lea     eax, [rdx+4]
        ret

编译器会进行优化。n但它是一个参数,因此无法修改。 JIT 编译器必须修改copy参数的值。

如果在递增之前将值分配给变量,Roslyn 编译器将消除增量。从这个 Sharplab.io 片段 https://sharplab.io/#v2:EYLgtghglgdgPgAQEwEYCwAoBBmABM3AYVwG9NcL89YAXXAMQApbcoBKU8y7gNwgCdcMALxQA3F24UA1NJhipFSVNnzFuZd1ULFmytvWY9FBAHYhEjNwC+3TNaA=,这段 C# 代码:

public int F(int i) {
    var n=i;
    ++n;       
    ++n;       
    ++n;       
    ++n;       

    return n;
} 

将被翻译成

public int F(int i)
{
    return i + 1 + 1 + 1 + 1;
}

最终编译成这个汇编代码:

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

Roslyn 没有优化多个增量是否有原因? 的相关文章

  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • Rx.NET 中是否有一个Subject 实现,其功能类似于BehaviourSubject,但仅在值发生更改时才发出?

    有没有Subject https learn microsoft com en us previous versions dotnet reactive extensions hh229699 v vs 103 Rx NET 中的实现在功能
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 如何使用 Regex.Replace 从字符串中删除数字?

    我需要使用Regex Replace从字符串中删除所有数字和符号 输入示例 123 abcd33输出示例 abcd 请尝试以下操作 var output Regex Replace input d string Empty The d标识符
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • 读取应用程序文件夹外的单独 web.config 文件

    我需要阅读web config文件 位于应用程序文件夹之外 位于任何其他目录中 我尝试了这段代码 string filePath C Users Idrees Downloads New folder Web config Configur
  • jQuery 性能、.css 或 addClass

    我有一个很大的 jQuery 代码 我正在考虑我的函数的速度性能 单击某个元素 鼠标按下 时 我需要指定图像作为背景 我可以通过两种方式做到这一点 element li class css background someimageURL o
  • 从自定义分布生成随机数

    我正在尝试从自定义分布生成随机数 我已经发现了这个问题 从 任意 连续概率分布进行模拟 https stackoverflow com questions 23570952 simulate from an arbitrary contin
  • 根据 Redux 状态更改组件的布局

    我正在用 React 开发一个课程安排应用程序 我用它作为学习 redux 的机会 我当前正在设计一个浏览菜单 作为浏览组件实现 它在加载时显示大学中的学校列表 当用户单击其中一所学校时 它会显示该学校内的科目列表 但是 我希望学校显示为网
  • 旋转时自动调整 UITableView 标题大小(主要在 iPad 上)

    我觉得这将是一个围绕 AutoResizingMasks 的简单答案 但我似乎无法理解这个主题 我有一个 iPad 应用程序 可以并排显示 2 个 UITableView 当我从纵向旋转到横向并返回时 UITableView 中的单元格会在
  • 如何在 IntelliJ IDEA 下运行所有​​ Specs2 测试?

    在我的 Scala 项目中 我的 Specs2 测试的结构如下 src test scala gt my package gt my package sub1 gt SomeTest1 gt SomeTest2 gt my package
  • .NET Core - C# - MacOS | .NET Core钥匙串API

    尝试使用 C 在 MacOS 上的 Keychain 中设置 获取一些密码 设法添加 Xamarin iOS 程序集 但似乎无法进一步 这就是我所拥有的 using System using Security using Foundatio
  • Sql Server 中的 DROP CASCADE

    我正在使用 Sql Server 和 pyodbc 的 Django 项目中运行向南迁移 这是向后迁移 因此南方正在尝试删除我的一些表 South 执行以下方法来删除表 def delete table self table name ca
  • Spring服务通过环境属性实现

    我有一个服务接口 interface ImageSearchService methods 我有两个实现 Service class GoogleImageSearchImpl implements ImageSearchService m
  • clang-format 破坏了 lint 注释

    我们在 C C 代码库中使用 lint 我也尝试开始在我的工作流程中集成 clang format 不幸的是 lint 有时需要注释来忽略特定检查 无论是以下格式 lint annotation or lint annotation 具体来
  • 使用已删除函数错误

    我遇到了问题 usr include c 4 6 ext new allocator h 108 9 error use of deleted function SMIBQueue SMIBQueue const SMIBQueue 使用
  • 如何使用符号访问 Sinatra 参数?

    在 Sinatra 中 我使用 params 来获取通过 URL 查询字符串传递的键 值 我注意到我可以使用字符串或符号作为获取值的键 所以如果网址是 http localhost 4567 x a 1 b 2 Then params a
  • 如何使文本向后倾斜?

    我想将文本设置为斜体向后或向左以与当前文本相反的方式 这可以用 HTML CSS 甚至 Javascript jQuery 来实现吗 我更新了 jos 的演示 使用 jQuery 将每个字母包装在一个跨度中 然后使用以下示例转换每个字母Mo
  • 将模型放入 Zend Framework 的库目录中

    我想将模型放在 Zend Framework 的模块目录之外 准确地说 在 library 文件夹中 library models actors ActorsMapper php Actor php books BooksMapper ph
  • 如何在Python 3.1中的类构造过程中找到绑定方法的类?

    我想编写一个装饰器 使类的方法对其他方可见 然而 我所描述的问题与该细节无关 代码大致如下 def CLASS WHERE METHOD IS DEFINED method def foobar method print CLASS WHE
  • C++ 从文件序列化/反序列化 std::map

    我有一个 std map 我想知道是否可以使用 fwrite 将其写入文件 并从文件中读取 或者是否需要单独写入 读取每个值 我希望 既然没什么特别的 这也许是可能的 use boost serialization用于在一行中序列化 它的标
  • AzureException:无法使用匿名凭据访问容器,并且在配置中找不到它们的凭据

    我正在尝试使用 Azure HDInsight 的 Hadoop 我通过 ssh 登录集群并运行以下命令 hadoop jar jar name class name wasb email protected cdn cgi l email
  • R中的多重采样[重复]

    这个问题在这里已经有答案了 我想知道如何在 R 中进行多次采样 例如 当我尝试将一些数据分为 60 训练数据 40 验证数据 时 我可以编写如下代码 original data read csv csv na strings train i
  • Jenkins ECS 和 EFS 错误

    我正在尝试使用 Jenkins 通过 EFS 部署到 ECS var jenkins home 已安装 看起来一切都很好 除了当我部署服务时 我在日志中收到以下错误 touch cannot touch var jenkins home c
  • Roslyn 没有优化多个增量是否有原因?

    我想看看如何Roslyn优化以下代码片段 code public int F int n n n n n return n asm C F Int32 L0000 inc edx L0002 inc edx L0004 inc edx L0