相关疑难解决方法(0)

.NET中属性的性能开销

我在某个地方读到,拥有公共财产比在一个班级中拥有公共成员更可取.

  1. 这只是因为抽象和模块化吗?还有其他任何超越原因吗?

  2. 属性访问由编译器转换为函数调用.对于没有备份存储的属性(例如public string UserName { get; set; }),与直接成员访问相比,性能开销会是多少?(我知道它通常不会有所作为,但在我的一些代码中,属性被访问了数百万次.)

Edit1:我在整数成员和属性上运行了一些测试代码,公共成员的速度是属性的3-4倍.(在调试中~57 ms.vs~206 ms.在Release中57与97 vs. 97是最常见的运行值).对于1000万次读写,两者都足够小,不足以证明改变任何东西.

码:

    class TestTime1
{
    public TestTime1() { }
    public int id=0;
}
class TestTime2
{
    public TestTime2() { }
    [DefaultValue(0)]
    public int ID { get; set; }
}


class Program
{
    static void Main(string[] args)
    {
        try
        {
            TestTime1 time1 = new TestTime1();
            TestTime2 time2 = new TestTime2();
            Stopwatch watch1 = new Stopwatch();
            Stopwatch watch2 = new Stopwatch();
            watch2.Start();
            for (int i = 0; …
Run Code Online (Sandbox Code Playgroud)

.net c# performance

21
推荐指数
3
解决办法
8117
查看次数

使用属性和性能

我正在优化我的代码,我注意到使用属性(甚至是自动属性)会对执行时间产生深远的影响.请参阅以下示例:

[Test]
public void GetterVsField()
{
    PropertyTest propertyTest = new PropertyTest();
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();
    propertyTest.LoopUsingCopy();
    Console.WriteLine("Using copy: " + stopwatch.ElapsedMilliseconds / 1000.0);

    stopwatch.Restart();
    propertyTest.LoopUsingGetter();
    Console.WriteLine("Using getter: " + stopwatch.ElapsedMilliseconds / 1000.0);
    stopwatch.Restart();
    propertyTest.LoopUsingField();
    Console.WriteLine("Using field: " + stopwatch.ElapsedMilliseconds / 1000.0);
}

public class PropertyTest
{
    public PropertyTest()
    {
        NumRepet = 100000000;
        _numRepet = NumRepet;
    }

    int NumRepet { get; set; }
    private int _numRepet;
    public int LoopUsingGetter()
    {
        int dummy = 314;
        for (int i = 0; …
Run Code Online (Sandbox Code Playgroud)

.net c# optimization performance

15
推荐指数
1
解决办法
715
查看次数

属性比字段慢

似乎我遇到的每个帖子都达成了相同的共识:仅返回字段的属性由JIT内联,并且具有与字段几乎相同的性能.

但是,我目前的情况似乎并非如此.我的程序进行密集计算,访问许多属性,这些属性只是自动获取器和私有设置器.但是,在这种特殊情况下,我只是复制一个对象.

在启用优化的情况下在发布模式下分析代码会导致get对属性函数的许多调用.Copy()总呼叫总计约5.6ms.

属性基准

但是,当属性转换为字段时,函数运行速度比使用属性快6倍:

在此输入图像描述

与使用字段相比,比较两个属性的相等性似乎会产生更多的性能损失.这是类IEquatable实现的基准,使用相同的代码,但使用字段交换属性.

在此输入图像描述

如果JIT应该通过内联来优化属性,为什么会出现?我想保留属性,因为它们的访问控制方面非常方便,但如果它们这么慢,我会坚持使用字段.

编辑:似乎受此问题影响的一些(但不是全部)案例正在使用在接口中声明的属性.在这些情况下没有使用其他多态性,但在这些情况下,删除接口会将性能差异带入预期的水平.

编辑2:如前面的编辑​​所述,似乎问题的一部分是由于接口虚拟调用.经过更多调查后,似乎在CLR中运行基准测试正确地内联属性,但JetBrains dotTrace没有,即使选中"启用内联"也是如此.

c# jit field properties

14
推荐指数
1
解决办法
164
查看次数

C#内联属性吗?

C#内联访问属性吗?我知道内联的JIT有32字节(指令?)限制,但它是内联属性还是只是方法调用?

.net c# clr optimization

12
推荐指数
4
解决办法
7658
查看次数

我的32位头痛现在是64位偏头痛?!?(或64位.NET CLR运行时问题)

在64位JIT和32位JIT下运行.NET应用程序时,在性能,内存等方面出现了不寻常的意外后果?我对好事感兴趣,但对人们遇到的令人惊讶的糟糕问题更感兴趣.

我正在编写一个新的.NET应用程序,它将部署在32位和64位.关于移植应用程序的问题有很多问题 - 从编程/移植的角度来看,我并不关心"陷阱".(即:正确处理本机/ COM互操作,嵌入在结构中的引用类型,更改结构的大小等)

然而,这个问题和它的答案让我思考 - 我还有什么其他问题可以忽略?

有很多问题和博客文章绕过这个问题,或者涉及到它的一个方面,但我还没有看到任何编制了一个很好的问题清单.

特别是 - 我的应用程序非常受CPU限制并且具有巨大的内存使用模式(因此首先需要64位),以及本质上是图形化的.我关心在64位Windows上运行的CLR或JIT中可能存在的其他隐藏问题(使用.NET 3.5sp1).

以下是我目前了解的一些问题:

我想知道人们在64位Windows上的JIT中发现了哪些其他具体的问题,以及是否有任何性能方面的解决方法.

谢谢你们!

- - 编辑 - - -

只是为了澄清 -

我知道尝试早期优化通常很糟糕.我知道第二次猜测系统通常很糟糕.我也知道64bit的可移植性有其自身的问题 - 我们每天在64位系统上运行和测试以帮助解决这个问题.等等

但是,我的应用程序不是典型的业务应用程序.这是一个科学的软件应用程序.我们有许多流程可以在所有核心(高度线程化)上使用100%CPU,每次数小时.

我花了很多时间来分析应用程序,这会产生巨大的差异.但是,大多数分析器都会禁用JIT的许多功能,因此当您在分析器下运行时,内存分配,JIT中的内联等小细节可能很难确定.因此我需要这个问题.

.net c# vb.net clr jit

9
推荐指数
1
解决办法
2224
查看次数

Windows 2008 64位上.NET应用程序的模式

我的.NET应用程序将如何在Windows 2008 x64下运行?作为32位应用程序还是64位?这有什么不同吗?

.net 64-bit x86

0
推荐指数
1
解决办法
274
查看次数

标签 统计

.net ×5

c# ×5

clr ×2

jit ×2

optimization ×2

performance ×2

64-bit ×1

field ×1

properties ×1

vb.net ×1

x86 ×1