RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 645151
Accepted
iRumba
iRumba
Asked:2020-03-28 17:36:30 +0000 UTC2020-03-28 17:36:30 +0000 UTC 2020-03-28 17:36:30 +0000 UTC

创建对象的时间是否取决于其属性和方法的数量?

  • 772

有2个类:

public class MyClass
{
    public int Prop { get; set; }
}

public class MyClass2
{
    public int Prop1 { get; set; }
    public int Prop2 { get; set; }
    public int Prop3 { get; set; }
    public int Prop4 { get; set; }
    public int Prop5 { get; set; }
}

这些类的构造函数是否会在相同的时间内工作?

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    MSDN.WhiteKnight
    2020-03-29T00:29:56Z2020-03-29T00:29:56Z

    研究表明,构造函数的执行时间取决于分配给类实例的内存量。因此,具有隐式获取/设置(如您的)的字段和属性会影响,而具有显式获取/设置的方法和属性不会影响(实例中没有为它们分配内存)。

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    
    namespace ConsoleTest
    {
    
        public class LittleClass
        {
            public int Prop0 { get; set; } 
        }
    
        public class BigClass
        {
            public int Prop1 { get; set; }
            public int Prop2 { get; set; }
            public int Prop3 { get; set; }
            public int Prop4 { get; set; }
            public int Prop5 { get; set; }           
        }
    
    
    
        class Program
        {
            const int N = 100000000;
    
    
            static void Main(string[] args)
            {
                Stopwatch s;            
                int i; 
    
                LittleClass lc = new LittleClass();
                BigClass bc = new BigClass();
    
                /* ------------------------------------------------------------------*/
                s = new Stopwatch();            
                Console.WriteLine("BigClass test...");
                s.Start();
                for (i = 0; i < N; i++)
                {
                    bc = new BigClass();                
                }
                s.Stop();
                Console.WriteLine("t=" + s.ElapsedMilliseconds.ToString());
                /* ------------------------------------------------------------------*/
                s = new Stopwatch();            
                Console.WriteLine("LittleClass test...");
                s.Start();
                for (i = 0; i < N; i++)
                {
                    lc = new LittleClass();                
                }
                s.Stop();
                Console.WriteLine("t=" + s.ElapsedMilliseconds.ToString());
                /* ------------------------------------------------------------------*/
                Console.ReadKey();
            }
        }  
    
    }
    

    结果(启用优化)

    结果

    根据我的计算,类初始化时间由公式描述

    t=(2.6*s+43.8)/(10^7) 毫秒

    其中 s 是为其分配内存的所有成员类型的总大小(见上文),

    相关系数为 0.99。

    我认为,常量组件的存在可以通过服务信息的存在来解释,据推测,在该服务信息下分配了 16 个字节。


    该研究是在一台处理器时钟速度为 2.33 GHz 的机器上进行的。要计算与机器无关的时间,必须将此公式乘以时钟频率,得到以“处理器周期”为单位的时间:

    t = 0.6*s+10.9

    • 5
  2. Vladislav Khapin
    2020-03-28T17:57:43Z2020-03-28T17:57:43Z

    由于没有属性初始化,IL 代码将是相同的并且很可能在速度上没有差异。

    MyClass2 的 IL:

      .method public hidebysig specialname rtspecialname instance void 
        .ctor() cil managed 
      {
        .maxstack 8
    
        // [46 9 - 46 26]
        IL_0000: ldarg.0      // this
        IL_0001: call         instance void [mscorlib]System.Object::.ctor()
    
        // [49 9 - 49 10]
        IL_0006: ret          
      } 
    

    MyClass 的 IL:

      .method public hidebysig specialname rtspecialname instance void 
        .ctor() cil managed 
      {
        .maxstack 8
    
        // [32 9 - 32 25]
        IL_0000: ldarg.0      // this
        IL_0001: call         instance void [mscorlib]System.Object::.ctor()
    
        // [35 9 - 35 10]
        IL_0006: ret          
    
      } // end of method MyClass::.ctor
    

    还是有区别的,我使用BenchmarkDotNet进行了测试。这很可能是因为对于自动属性的字段,在创建类时会调用默认构造函数。程序代码:

    using BenchmarkDotNet.Attributes;
    using BenchmarkDotNet.Running;
    
    namespace ConsoleApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                var summary = BenchmarkRunner.Run<ClassCreator>();
            }
        }
    
        public class ClassCreator
        {
            [Benchmark]
            public MyClass CreateMyClass()
            {
                return new MyClass();
            }
    
            [Benchmark]
            public MyClass2 CreateMyClass2()
            {
                return new MyClass2();
            }
        }
        public class MyClass
        {
            public int Prop { get; set; }
        }
    
        public class MyClass2
        {
            public int Prop1 { get; set; }
            public int Prop2 { get; set; }
            public int Prop3 { get; set; }
            public int Prop4 { get; set; }
            public int Prop5 { get; set; }
        }
    }
    

    结果:

    BenchmarkDotNet=v0.10.3.0, OS=Microsoft Windows 10.0.14393
    Processor=Intel(R) Core(TM) i5-4670 CPU 3.40GHz, ProcessorCount=4
    Frequency=3320319 Hz, Resolution=301.1759 ns, Timer=TSC
    dotnet cli version=1.0.1
      [Host]     : .NET Core 4.6.25009.03, 64bit RyuJIT
      DefaultJob : .NET Core 4.6.25009.03, 64bit RyuJIT
    
    
     |         Method |      Mean |    StdDev |
     |--------------- |---------- |---------- |
     |  CreateMyClass | 2.4932 ns | 0.0185 ns |
     | CreateMyClass2 | 3.3029 ns | 0.0982 ns |
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5