草庐IT

c# - 我如何充分了解 CLR 以对性能问题做出有根据的猜测?

是的,我正在使用分析器(ANTS)。但在微观层面,它不能告诉你如何解决你的问题。我现在正处于微优化阶段。例如,我正在对此进行分析:for(intx=0;xANTS显示y循环线花费了大量时间。我认为这是因为它必须不断调用Heightgetter。所以我创建了一个本地intheight=Height;在循环之前,并使内部循环检查y.这实际上使性能变差了!ANTS现在告诉我x-loop-line有问题。嗯?这应该是微不足道的,它是外循环!最终我有了一个启示——也许使用外循环绑定(bind)的属性和内循环绑定(bind)的本地使得CLR经常在“本地”缓存和“this-pointer”缓存之间跳

c# - 检索 JIT 输出

我有兴趣查看C#程序(不是CLR字节码指令)的实际x86程序集输出。有什么好的方法吗? 最佳答案 在VisualStudio中调试应用程序时,您可以右键单击已停止(使用断点)的代码,然后单击“转到反汇编”。您可以通过native指令进行调试。至于使用磁盘上的*.exe文件,也许你可以使用NGen生成native输出然后反汇编它(虽然我从未尝试过,所以我不能保证它会起作用)。以下是用C#编写的简单算术运算的一些示例操作码:intx=5;movdwordptr[ebp-40h],5inty=6;movdwordptr[ebp-44h],

c# - 为什么我的 Close 函数没有被调用?

classProgram:CriticalFinalizerObject{staticvoidMain(string[]args){Programp=newProgram();TextWriterTraceListenerlistener=newTextWriterTraceListener(@"C:\trace.txt");Trace.Listeners.Clear();//RemovedefaulttracelistenerTrace.Listeners.Add(listener);Trace.WriteLine("FirstTrace");//Generatesometracem

c# - Thread.sleep vs Monitor.Wait vs RegisteredWaitHandle?

(以下项目有不同的目标,但我很想知道它们是如何“暂停”的)问题Thread.sleep-它会影响系统的性能吗?它会占用线程等待吗?Monitor.Wait呢?他们“等待”的方式有什么不同?他们会在等待时占用线程吗?RegisteredWaitHandle怎么样?此方法接受等待时执行的委托(delegate)句柄发出信号。在等待期间,它不会占用线程。所以一些线程被暂停并且可以被委托(delegate)唤醒,而其他线程只是等待?旋转?有人可以把事情说清楚吗?编辑http://www.albahari.com/threading/part2.aspx 最佳答案

c# - 为什么类实例的私有(private)成员在 Equals() 方法体中可用?

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Whyaremyprivatesaccessible?Whyareprivatefieldsprivatetothetype,nottheinstance?很可能我遗漏了一个明显的事实,但我真的看不出原因:当我覆盖Equals()方法并且当我将对象转换为我的类型时,我能够调用它的私有(private)成员没有任何问题!我正在初始化一个实例,我希望它的私有(private)成员不可访问。但是为什么被转换的对象在Equals()方法中向我开放它的私有(private)?查看下面示例代码中的Equals实现,看看我

c# - 用例来理解为什么字符串列表应该被声明为只读

我试图了解哪些用例需要我将List声明为ReadOnly类型。与此相关的一个问题是:在实例化列表时分配了多少内存? 最佳答案 将字段标记为readonly的主要原因是为了让您知道常规代码不能交换列表引用。一个可能重要的关键场景是,如果您有其他代码在使用lock(theListField)对列表执行同步的类型中。.显然,如果有人交换列表实例:事情就会崩溃。请注意,在大多数具有列表/集合的类型中,预计不会更改实例,因此readonly断言这种期望。一个常见的模式是:privateList_items=newList();publicLi

c# - .NET 中的多目标

浏览了各种博客,我对“多目标”或并行执行的术语感到很困惑。一些博客说,并行执行意味着一个进程中有两个版本的CLR。其他一些人声称,它就像.net2.0和.net3.0程序集并排执行。我非常失望,因为我不确定谁对谁错。我还在许多博客(如ScottHanselman的博客等)中看到(这很令人困惑),如果目标框架是4.0,.NET4.5的任何功能都将不起作用。我可以同意。但是我不能同意也不能理解这样一个事实,即4.0的一个特性,其bug在4.5中被修复,如果我使用4.5构建它并在4.0中部署它将会隐藏。在这里我不理解“隐藏”这个词,也没有人敢解释它到底是什么意思。这意味着运行时错误?这意味着

c# - C# 中的可变字段

来自规范10.5.3可变字段:volatile字段的类型必须是以下之一:引用类型。类型byte,sbyte,short,ushort,整数、单位、字符、float、bool值、System.IntPtr或System.UIntPtr。具有枚举基类型的枚举类型byte,sbyte,short,ushort,int,或单位。首先我想确认我的理解是正确的:我猜想上面的类型可能是易变的,因为它们在内存中存储为一个4字节的单元(对于引用类型,因为它的地址),这保证了读/写操作是原子的。double/long/etc类型不能是易失的,因为它们不是原子读/写,因为它们在内存中超过4个字节。我的理解正

c# - 为什么向结构体添加一个额外的字段会大大提高其性能?

我注意到包装单个float的结构比直接使用float要慢得多,性能只有大约一半。usingSystem;usingSystem.Diagnostics;structVector1{publicfloatX;publicVector1(floatx){X=x;}publicstaticVector1operator+(Vector1a,Vector1b){a.X=a.X+b.X;returna;}}然而,在添加额外的“额外”字段后,似乎发生了一些神奇的事情,性能再次变得更加合理:structVector1Magic{publicfloatX;privateboolmagic;public

c# - 如何衡量 .NET 中托管线程的性能

我想测量托管(.NET)线程的性能。具体来说,我需要测量以下-线程使用CPU多长时间?它保持阻塞多长时间(等待远程方法调用完成)?使用System.Diagnostic.StopWatch没有帮助,因为它读取操作系统/硬件的高分辨率性能计时器功能,其中可能包括并行运行和共享同一CPU的其他线程消耗的时间。 最佳答案 您可以使用此处描述的方法http://www.codeproject.com/KB/dotnet/ExecutionStopwatch.aspx它使用系统函数GetThreadTimeshttp://msdn.micro