草庐IT

GC优化

全部标签

C#,奇怪的优化

我正在尝试阅读我编译的C#代码。这是我的代码:using(OleDbCommandinsertCommand=newOleDbCommand("...",connection)){//dosuperstuff}但是!我们都知道using会被翻译成这样:{OleDbCommandinsertCommand=newOleDbCommand("...",connection)try{//dosuperstuff}finally{if(insertCommand!=null)((IDisposable)insertCommand).Dispose();}}(因为OleDbCommand是引用类

c# - 分配相同大小的对象是否会提高 GC 或 "new"性能?

假设我们要创建许多字节数组类型的小对象。大小各不相同,但总是低于1024字节,比如780,256,953....如果我们始终只分配bytes[1024],并且只使用需要的空间,是否会随着时间的推移提高operatornew或GC效率?UPD:这是短暂的生命对象,为解析二进制协议(protocol)消息而创建。UPD:在这两种情况下,对象的数量是相同的,只是分配的大小发生了变化(随机vs.总是1024)。在C++中,由于碎片化和C++的新性能,这很重要。但是在C#中.... 最佳答案 Willitimproveoperatornewo

c# - 如何使用 GC.KeepAlive() 以及用于什么目的?

我们如何使用GC.KeepAlive()目的是什么?我使用套接字将文件从终端(Windows-CE)传输到服务器。传输所需时间为8分钟。5分钟后Windows-CE关闭(如果未按下触摸屏)如果我为此使用GC.KeepAlive(),这是否解决了我的问题? 最佳答案 您很少需要使用GC.KeepAlive-非常很少。例如,如果您想防止终结器的副作用过早发生,您可以使用它。我最常看到它用于Mutex-保持互斥直到应用程序结束,以确保只有一个实例。(using语句实际上在这里更好,但这是另一回事。)不,这听起来与您的情况无关。

具有尾递归优化的 C# 编译?

基于丰富的stackoverflow,我一直在断断续续地回答尾递归优化是否针对特定的c#代码进行。几个问题似乎在谈论对正在发布的较新版本的.net进行优化的推测将应用构建为x64位应用以实现优化在VisualStudio中从调试版本切换到发布版本以实现优化根本没有优化,并且微软社区声称他们不会针对“安全问题”进行尾递归优化(并没有真正理解这一点)它是随机发生的那么从C#4.0(VisualStudio2013/2015)开始,如果可以确保尾递归优化,如何确保它呢? 最佳答案 可以支持尾调用优化的不同级别。JIT实际上负责任何.NET

c# - 编译器是否优化对 const 变量和文字 const 数字的操作?

假设我有一个带字段的类:constdoublemagicalConstant=43;这是代码中的某处:doublerandom=GetRandom();doubleunicornAge=random*magicalConstant*2.0;编译器是否会优化我的代码,使其不会在每次计算unicornAge时都计算magicalConstant*2.0?我知道我可以定义下一个将这个乘法考虑在内的常量。但这在我的代码中看起来更清晰。编译器对其进行优化是有意义的。 最佳答案 (这个问题是thesubjectofmybloginOctober

c# - C# 中最重要的优化性能最佳实践是什么

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭1年前。Improvethisquestion当我在阅读thistutorial我注意到以下有关在C#中使用结构的性能提示:Unlessyouneedreferencetypesemantics,aclassthatissmallerthan16bytesmaybemoreefficientlyhandledbythesystemasastruct.我在stackoverflow中查找了类似的问题,并在ADO.Net中找到了一些关于性

c# - c# 编译器是否优化 Count 属性?

Listlist=...for(inti=0;i那么编译器是否知道list.Count不必每次迭代都调用? 最佳答案 你确定吗?Listlist=newList{0};for(inti=0;i如果编译器缓存了上面的Count属性,list的内容将是0和1。如果没有缓存,内容将是从0到100.现在,这对您来说可能看起来像是一个人为的例子;但是这个呢?Listlist=newList();inti=0;while(list.Count这两个代码片段似乎完全不同,但这只是因为我们倾向于思考for循环与while循环。在任何一种情况下,每次

c# - 将 Surface 保存为位图并在 C# 中优化 DirectX 屏幕捕获

经过一整天的测试,我想出了这段代码,它使用DirectX(SlimDX)捕获当前屏幕并将其保存到一个文件中:Deviced;publicDxScreenCapture(){PresentParameterspresent_params=newPresentParameters();present_params.Windowed=true;present_params.SwapEffect=SwapEffect.Discard;d=newDevice(newDirect3D(),0,DeviceType.Hardware,IntPtr.Zero,CreateFlags.SoftwareV

c# - 为什么尾调用优化需要操作码?

所以I'vereadmanytimesbefore从技术上讲,.NET确实支持尾调用优化(TCO),因为它具有适用于它的操作码,而只是C#不生成它。我不确定为什么TCO需要操作码或它会做什么。据我所知,能够做到TCO的要求是递归调用的结果不与当前函数范围内的任何变量相结合。如果你没有那个,那么我看不出操作码如何阻止你必须保持堆栈框架打开。如果确实有,那么编译器就不能总是轻松地将它编译成迭代的东西吗?那么操作码有什么意义呢?显然我缺少一些东西。在TCO完全可能的情况下,难道不能总是在编译器级别而不是在操作码级别处理它吗?有什么地方不能的例子? 最佳答案

c# - JIT 编译器的 IL 优化

我正在开发一个发出IL代码的编译器。重要的是,生成的IL由Mono和Microsoft.NETJIT编译器JIT为尽可能最快的机器代码。我的问题是:优化以下模式是否有意义:'stloc.0;ldloc.0;ret'=>'ret''ldc.i4.0;conv.r8'=>'ldc.r8.0'等等,或者JIT是否足够聪明来处理这些?是否有包含Microsoft/MonoJIT编译器执行的优化列表的规范?是否有任何关于优化IL的实用建议/最佳实践的好读物,以便JIT编译器可以反过来生成最佳机器代码(性能方面)? 最佳答案 您描述的两种模式是