IL 中的 ldsfld 和 ldstr 有什么区别?

2023-11-24

我读过一些关于 String.Empty 与 "" 的文章,我也自己做了测试。它们之间的区别如下。

字符串.空

L_0001: ldsfld string [mscorlib]System.String::Empty

""

L_0001: ldstr ""

在我与朋友交谈后,他们认为 String.Empty 比 "" 更快,因为在幕后(在汇编级别)ldstr 比 ldsfld 多做 1 个圆圈。 (我不记得使它们不同的步骤)

我想知道如何检查这方面的性能。


The ldsfld操作将静态字段的值推送到计算堆栈上,而ldstr推送对元数据字符串文字的引用。

性能差异(如果有的话)将是最小的。新版本的编译器实际上替代了"" for String.Empty.

您还应该考虑代码的可读性和可维护性。使用String.Empty更清楚的是,您实际上指的是一个空字符串,而不仅仅是忘记在字符串文字中输入某些内容。

Edit:

我查看了创建的本机代码。

C# 3,发布模式,x86:

        string a = String.Empty;
0000002a  mov         eax,dword ptr ds:[0356102Ch]
0000002f  mov         dword ptr [ebp-8],eax
        string b = "";
00000032  mov         eax,dword ptr ds:[0356202Ch]
00000038  mov         dword ptr [ebp-0Ch],eax

C# 3,发布模式,x64:

        string a = String.Empty;
0000003b  mov         rax,12711050h 
00000045  mov         rax,qword ptr [rax] 
00000048  mov         qword ptr [rsp+28h],rax 
        string b = "";
0000004d  mov         rax,12713048h 
00000057  mov         rax,qword ptr [rax] 
0000005a  mov         qword ptr [rsp+30h],rax 

所以,最终代码是相同的。

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

IL 中的 ldsfld 和 ldstr 有什么区别? 的相关文章

随机推荐

  • Asp.net 身份密码哈希

    新的 ASP net Identity 项目为网站安全带来了一些有用的代码和接口 要使用接口 而不是使用 MVC 5 模板中包含的标准实体框架实现 实现自定义系统 IPasswordHasher是必须的 IPasswordHasherASP
  • 从 Spring Batch 处理器调用异步 REST api

    我编写了一个处理列表列表的 Spring 批处理作业 Reader 返回列表的列表 处理器处理每个 ListItem 并返回处理后的 List Writer 将列表中的内容写入 DB 和 sftp 我有一个用例 我从 Spring Batc
  • 更改 mysql SELECT 中的日期格式的最佳方法?

    任何人都可以告诉我 我需要更改数据格式2010 05 14 17 53 to 14 05 2010 17 53使用 mysql 选择查询 尝试这个选择 SELECT DATE FORMAT datefield d m Y H i FROM
  • 在 Linux CLI 上将常见视频格式转换为 FLV 的最佳工具是什么 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我被指派开发的新产品的一部分涉及到服务器端将 常见 视频格式转换为 Flash 可以播放的格式 据我所知 我唯一的选择就是转换为 FLV 我一直在尝试 ffmpeg 但我发现一些 W
  • 如何使用 gson 创建按键排序的 json?

    我需要创建常量 json 字符串或按键排序的 json 常量 json 字符串是什么意思 请查看我创建的以下代码示例 我的代码1 public class GsonTest class DataObject private int data
  • 有没有更 Pythonic 的方法来防止向列表中添加重复项?

    是否有更Pythonic 或简洁 的方法来防止向列表添加重复项 if item not in item list item list append item 或者这实际上是一种廉价的操作 由于 hcwsha的原始解决方案已被替换 我将其记录
  • C# unity 通过属性拦截

    有没有办法在 C unity 中使用属性拦截并将对象注册代码保留在 XML 文件 如 app config 中 如果是的话 您能给我提供代码吗 这样的注册应该是什么样子 我做了很多解决方法 但没有找到解决此问题的有效解决方案 我假设您的意思
  • Firefox 内容脚本未在某些页面加载

    Context 我目前正在开发一个浏览器扩展 它可以在 Chrome 和 Opera 上按预期工作 但在 Firefox 上遇到问题 这是一个最小版本manifest json重现问题所需 name Example version 0 0
  • 如何在 3D 空间中正确移动相机?

    我想做的事 我正在尝试弄清楚如何使相机像这样工作 鼠标移动 相机旋转 上 下键 摄像机前进 后退 向前表示相机面向的方向 左 右键 相机横向移动 Q E键 相机上下移动 由于我有很多代码 因此我将尽力解释我是如何做到的 而不需要太多代码 我
  • 如何使用 python 重试 Behave 中的失败场景

    有人可以告诉我如何使用 Python 在 Behave 中再次运行失败的测试吗 如果失败 我想自动重新运行失败的测试用例 行为库实际上有一个RerunFormatter这可以帮助您重新运行之前测试运行的失败场景 它会创建一个包含所有失败场景
  • Android NavigationView 带圆角

    我正在设计一个定制抽屉 on Android 它的顶部和底部必须有圆角 我首先自定义顶部 我发现问题是形状的背景不透明 I have source toile libre org I need to build source toile l
  • 为什么“插入”函数不使用 MySQLdb 添加行?

    我正在尝试弄清楚如何在 Python 中使用 MySQLdb 库 对于这两个库我充其量都是新手 我正在关注代码here 具体来说 cursor conn cursor cursor execute DROP TABLE IF EXISTS
  • 如何将因子转换为整数\数字而不丢失信息?

    当我将因子转换为数字或整数时 我得到的是基础级别代码 而不是数字形式的值 f lt factor sample runif 5 20 replace TRUE 1 0 0248644019011408 0 0248644019011408
  • Java方法对任意数量的整数求和

    我需要写一个java方法sumAll 它接受任意数量的整数并返回它们的总和 sumAll 1 2 3 returns 6 sumAll returns 0 sumAll 20 returns 20 我不知道该怎么做 如果您使用 Java8
  • 使用 array_multisort() 和动态数量的参数/参数/规则/数据对数组进行排序

    我正在尝试对任何数组进行排序array multisort 一切都很好 但是 根据脚本中的条件 我需要更改选项 到目前为止我所拥有的是这样的 array multisort sort1 SORT ASC sort2 SORT ASC sor
  • 如何在Python中的绘图中添加填充?

    我正在尝试在绘图的左侧和右侧添加填充 但是当我改变 xlim 和 ylim 时 图像变小 我究竟做错了什么 import matplotlib pyplot as plt plt rcParams text usetex False fro
  • 在JSF2中,如何知道复合组件是否有子组件?

    我正在编写一个复合组件 您有一个名为 的特殊标签
  • 获取 Android 蓝牙设备的重命名名称

    我的 Android 手机允许我重命名已配对的设备 方法是转至 设置 gt 无线和网络 gt 蓝牙 活动页面 然后单击已配对蓝牙设备右侧的设置按钮 但是 当我查询带有以下内容的绑定设备列表时蓝牙适配器 getBondedDevices 函数
  • 如何区分日志文件中的 log4j 会话和同一 Web 应用程序的副本?

    只有一个文件 它是在 Web 应用程序副本运行时同时写入的 如何从其他日志行中仅过滤一条会话日志消息 使用具有 NDC 或 MDC 信息的 servlet 过滤器是我见过的最好方法 两者的快速比较可以在http wiki apache or
  • IL 中的 ldsfld 和 ldstr 有什么区别?

    我读过一些关于 String Empty 与 的文章 我也自己做了测试 它们之间的区别如下 字符串 空 L 0001 ldsfld string mscorlib System String Empty L 0001 ldstr 在我与朋友