问题标签 [unboxing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - “as”和可空类型的性能惊喜
我只是在深度修改处理可空类型的 C# 的第 4 章,并且我正在添加一个关于使用“as”运算符的部分,它允许您编写:
我认为这真的很简洁,并且它可以提高 C# 1 等效项的性能,使用 "is" 后跟一个强制转换 - 毕竟,这样我们只需要请求一次动态类型检查,然后是一个简单的值检查.
然而,情况似乎并非如此。我在下面包含了一个示例测试应用程序,它基本上将对象数组中的所有整数相加 - 但该数组包含大量空引用和字符串引用以及装箱整数。该基准测试您必须在 C# 1 中使用的代码、使用“as”运算符的代码,以及仅用于启动 LINQ 解决方案的代码。令我惊讶的是,在这种情况下,C# 1 代码的速度要快 20 倍——甚至 LINQ 代码(考虑到所涉及的迭代器,我预计它会更慢)胜过“as”代码。
可空类型的 .NET 实现isinst
真的很慢吗?unbox.any
是导致问题的附加因素吗?对此还有其他解释吗?目前感觉我将不得不包含一个警告,不要在性能敏感的情况下使用它......
结果:
演员:10000000:121
作为:10000000:2211
LINQ:10000000:2143
代码:
c# - C# 编译器 + 带有装箱的通用代码 + 约束
让我们检查为以下通用方法生成的 MSIL 代码:
看:
但是对于上面的通用代码,更有效的 IL 表示应该是:
从约束中可知,该值被装箱到引用类型中。Unbox.any
opcode 是完全多余的,因为在box
opcode 之后,IL 堆栈中的值已经是对 的有效引用!!U
,无需任何拆箱即可使用。
为什么 C# 3.0 编译器不使用约束元数据来生成更高效的通用代码?Unbox.any 的开销很小(只是慢了 4 到 5 倍),但为什么不在这种情况下发出更好的代码呢?
c# - 如何防止拆箱 - 读取任意 sql 行时装箱内存开销
我正在编写一个类来表示 SQL 查询中的一行。我希望通过类的 indexer 属性访问字段数据。如果我将数据加载到内部对象列表中,这很简单。我已经尝试过这个并且对原始人的拳击不满意。拳击增加了 20% 的内存需求。我想将原语存储为类中的原语。DataTable 类通过为从 IDataReader 返回的架构中的每一列创建数组来存储基元。我以这种方式实现了一个类,但我更喜欢将数据与行对象一起存储,而不是存储在行内部引用的列中。
有什么想法可以做到这一点吗?
c - 如何制作一个未装箱的浮点数组,我可以得到一个 Ptr
我正在尝试使用 HopenGL 做一些工作,我需要一个指向浮点数组的 Ptr。从我读过的内容来看, uarray 和 storableArray 似乎是要走的路,以某种方式结合起来。
c# - 当使用泛型在集合中使用对象时,.Net 会进行类型转换吗?
.net CLR 是否将对象类型转换为集合声明中提到的对象?如果我声明一个
.net 在添加和检索时会对该对象进行类型转换??????
好吧,我认为每个人都没有清楚地理解这个问题。让我详细说明一下。在 java 中有泛型,但是如果你反编译代码你会注意到,编译器在任何使用 Collection 对象的地方放置一个类型转换。例如:列表 listOfStrings;listOfStrings.add(""); 字符串值 = listOfStrings.get(1); 反编译类文件后我们看到这个List listOfStrings;listOfStrings.add(""); 字符串值 = (String)listOfStrings.get(1); 在这里,编译器已经对字符串进行了类型转换。
现在我的问题是.Net中是否相同?
java - 内部编译器错误 ArrayIndexOutOfBoundsException: -1 ... generateUnboxingConversion
尝试编译时遇到了一些奇怪的异常:
这是一个有效的检查(拆箱-隐式强制转换-拆箱)吗?
c# - 拆箱数据库值的正确方法
我正在使用较旧的 Oracle 数据库,并且我觉得可能有更好的方法来取消我从数据库中检索的值的装箱。
目前,我有一个充满不同类型特定方法的静态类:
..等等不同类型,但我觉得应该有更好的方法?如果我想拆箱一个值,我会做一些事情......
我考虑过使用泛型类来处理所有不同的类型,但我真的想不出最好的方法。
有任何想法吗?
java - Java 自动拆箱 - 是否有编译器警告?
我是 Java 自动装箱的忠实粉丝,因为它节省了很多丑陋的样板代码。但是,我发现在 Number 对象可能为空的某些情况下,自动拆箱会让人感到困惑。有什么方法可以检测代码库中发生自动拆箱的位置并带有 javac 警告?任何其他仅检测拆箱事件的解决方案(例如 FindBugs 或 Eclipse 特定的编译器警告)将不胜感激,因为我找不到任何解决方案。
为了澄清,我不希望在装箱时产生任何警告 - 只拆箱。
下面是一些可能导致混淆 NullPointerExceptions 的代码的简单示例:
vb.net - 将 .GetValueOrDefault(0) 和 If(variable, 0) 与可空类型一起使用有什么区别吗?
以下两种计算 c 的方法之间有什么区别……特别是装箱/拆箱问题?