C#对象创建比构造函数调用慢得多

Ste*_*eve 3 c# performance

对于我的生活,我无法弄清楚我的代码中的性能影响.我有一个容器对象,我在其中测量运行构造函数(下面的对象)所需的时间,公共构造函数中的计时代码

 public class WorkUnit : IWorkUnit
{
    private JobInformation m_JobInfo;
    private MetaInfo m_MetaInfo;
    private IPreProcJobInfo m_PreprocDetails;


    readonly private Guid m_ID;
    private Guid m_ParentID;
    private Guid m_MasterJobID;


    private string m_ErrorLog = string.Empty;
    private PriorityKeeper m_Priority;
    private WorkUnitClassification m_Classification;

    private IJobPayload m_CachedPayload;
    private IJobLogger m_Logger;
    private EventHandler<JobEventArgs> m_IsFinished;
    private ReaderWriterLockSlim m_Lock;

    public WorkUnit(string InputXML, Guid JobID, IJobLogger Logger)
    {
        DateTime overstarttime = DateTime.Now;

        try
        {
        ....Do Stuff....
        }
        catch(XMLException e)
        {...}
        catch(Exception e)
        {
         ...
         throw;
        }

        double time = (DateTime.Now - overstarttime).TotalMilliseconds
        Console.WriteLine("{0}", time);
    }

    /// <summary>
    /// Private Constructor used to create children
    /// </summary>
    private WorkUnit(Guid MasterID, Guid ParentID, WorkUnitClassification Classification, PriorityKeeper Keeper)
    {...}

    [OnDeserializing()]
    private void OnDeserialize(StreamingContext s)
    {...}

    public PriorityKeeper PriorityKey
    {...}

    public bool HasError
    {...}

    public bool Processing
    {...}

    public bool Splittable
    {...}

    public IEnumerable<IWorkUnit> Split(int RequestedPieces, int Bonds)
    {...}

    public void Merge(IResponse finishedjob)
    {...}

    public ReadOnlyCollection<IWorkUnit> Children
    {...}

    public bool IsMasterJob
    {...}

    public Guid MasterJobID
    {...}

    public Guid ID
    {...}

    public Guid ParentID
    {...}

    public EnumPriority Priority
    {...}

    public void ChangePriority(EnumPriority priority)
    {...}

    public string ErrorLog
    {...}

    public IMetaInfo MetaData
    {...}

    public IJobPayload GetProcessingInfo()
    {... }

    public IResponseGenerator GetResponseGenerator()
    {... }

}
Run Code Online (Sandbox Code Playgroud)

现在,我正在测量创建对象所需的总时间

DateTime starttime = DateTime.Now;
var test = new WorkUnit(temp, JobID, m_JobLogger);
double finished = (DateTime.Now - starttime).TotalMilliseconds;
Run Code Online (Sandbox Code Playgroud)

我一直得到以下表现数字 -

构造函数时间 - 47毫秒

对象创建时间 - 387毫秒

47毫秒是可以接受的,387真的很糟糕.取出记录可以忽略不计地改变这些数字.有谁知道为什么这么长时间?我的系统是VS 2008 SP1,针对Windows XP上的.NET 3.5 SP1.我将不胜感激任何解释.我将很快打破探查器,但我觉得它无法深入研究解释这种行为所需的水平.谢谢你的帮助.

编辑:我正在发布

Win*_*ith 7

你确定你所看到的是对象创建时间而不是CLR启动的效果吗?

尝试在循环中运行测试50次并忽略第一个结果.

  • 这有点道理.DateTime.Now需要做各种有趣的事情,比如我现在在夏令时,我在哪个时区,等等.第一次加载所有代码是昂贵的; 每个后续时间都很便宜,因为它只是调用"热"代码,而不是加载它"冷". (2认同)

Ree*_*sey 6

史蒂夫,

以下是需要考虑的几件事:

  1. 从使用DateTime切换到使用StopWatch.对于这些类型的情况,它更加准确.
  2. 在计时过程中停止写入控制台.IO将是重要的,并影响您的时间.
  3. 确保您在发布/优化版本中运行,而不是在Visual Studio测试主机下运行.如果从默认VS运行,请切换到Release,build,然后使用Ctrl + F5(而不仅仅是F5)运行.

鉴于你的时间安排,我猜测#2是你的问题.Visual Studio添加了许多能够显着影响性能的"钩子".在Visual Studio中运行时的计时.