似乎我遇到的每篇文章都达成了相同的共识:仅返回字段的属性由 JIT 内联并且具有与字段几乎相同的性能。
但是,我目前的情况似乎并非如此。我的程序进行密集计算,访问许多简单的自动 getter 和私有(private) setter 的属性。然而,在这种特殊情况下,我只是复制一个对象。
在启用优化的 Release模式下分析代码会导致多次调用属性的 get 函数。对 Copy() 的调用总计约 5.6 毫秒。
但是,当属性被转换为字段时,该函数的运行速度比使用属性快 6 倍:
与使用字段相比,比较两个属性的相等性似乎会导致更多的性能损失。这是一个类的 IEquatable 实现的基准测试,使用相同的代码但将属性与字段交换。
如果 JIT 应该通过内联来优化属性,为什么会发生这种情况?我想保留属性,因为它们的访问控制方面非常方便,但如果它们慢得多,我会坚持使用字段。
编辑: 似乎受此问题影响的一些(但不是全部)案例正在使用接口(interface)中声明的属性。在这些情况下没有使用其他多态性,但在这些情况下删除接口(interface)会使性能差异达到预期水平。
编辑 2: 如之前的编辑所述,部分问题似乎是由于接口(interface)虚拟调用引起的。经过更多调查后,似乎在 CLR 中运行基准测试可以正确地内联属性,但 JetBrains dotTrace 却没有,即使选中了“启用内联”。
最佳答案
不幸的是,除了尝试通过使用
来帮助消除 JITTER 之外,您无能为力[MethodImpl(MethodImplOptions.AggressiveInlining)]
AggressiveInlining The method should be inlined if possible.
现在从技术上讲,这只能用在方法或构造函数上,但是您似乎可以在 getter 和 setter 本身上测试它。即它可以编译(虽然我还没有测试过)
public int someType
{
[MethodImplAttribute(MethodImplOptions.AggressiveInlining)]
get;
[MethodImplAttribute(MethodImplOptions.AggressiveInlining)]
set;
}
注意:内联是一个令人惊奇的黑盒,抖动可能喜欢也可能不喜欢,甚至属性也只是一个建议。另请注意,位数也可能会影响它内联的内容。
最后,我认为你正在以正确的方式解决这个问题,你应该只使用 bechmarker 或分析器,并相应地进行微优化,
关于c# - 属性比字段慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53772811/
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我几天前在我的rubyonrails2.3.2上安装了Sphinx和Thinking-Sphinx,基本搜索效果很好。这意味着,没有任何条件。现在,我想用一些条件过滤搜索。我有公告模型,索引如下所示:define_indexdoindexestitle,:as=>:title,:sortable=>trueindexesdescription,:as=>:description,:sortable=>trueend也许我错了,但我注意到只有当我将:sortable=>true语法添加到这些属性时,我才能将它们用作搜索条件。否则它找不到任何东西。现在,我还在使用acts_as_tag
假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案
我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona
我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我