简介:有很多评论说"WinForms不能自动扩展到DPI /字体设置;切换到WPF".但是,我认为这是基于.NET 1.1; 看起来他们在.NET 2.0中实现自动扩展实际上做得非常好.至少基于我们迄今为止的研究和测试.但是,如果你们中的一些人知道的更好,我们很乐意听取你的意见.(请不要打扰我们应该切换到WPF ...现在不是一个选项.)
WinForms中的内容不能正确自动缩放,因此应该避免?
编写WinForms代码时程序员应遵循哪些设计指南,以便自动扩展?
请参阅下面的社区维基答案.
这些是不正确还是不充分?我们应采用的其他指导方针?是否还有其他需要避免的模式?对此的任何其他指导将非常感激.
简介: 我用C#编写高性能代码.是的,我知道C++会给我更好的优化,但我仍然选择使用C#.我不想辩论这个选择.相反,我想听听那些像我一样试图在.NET Framework上编写高性能代码的人.
问题:
我想我知道: 原始的.NET JIT编译器不会内联涉及结构的任何内容.奇怪的给定结构只应该用于需要像内置函数那样优化的小值类型的情况,但是确实如此.幸运的是,在.NET 3.5SP1和.NET 2.0SP2中,他们对JIT Optimizer进行了一些改进,包括对内联的改进,特别是对于结构.(我猜他们这样做是因为否则他们引入的新的Complex结构会表现得非常糟糕......所以复杂团队可能会对JIT Optimizer团队产生影响.)因此,.NET 3.5 SP1之前的任何文档都可能是与这个问题不太相关.
我的测试显示: 我已经通过检查C:\ Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll文件的版本> = 3053来验证我有更新的JIT优化器,所以应该有这些改进到JIT优化器.然而,即便如此,我的拆卸时间和外观都表明:
用于传递具有两个双精度的结构的JIT生成的代码远不如直接传递两个双精度的代码有效.
与传递struct作为参数相比,JIT生成的struct方法代码传递'this'的效率要高得多.
如果你传递两个双打而不是传递一个带有两个双精度的结构,JIT仍然可以更好地内联,即使是由于明显在循环中的乘数.
时间: 实际上,看看反汇编,我意识到循环中的大部分时间只是从List中访问测试数据.如果分解循环的开销代码和访问数据,则进行相同调用的四种方法之间的差异会大不相同.对于PlusEqual(double,double)而不是PlusEqual(Element),我可以获得5倍到20倍的加速比.使用PlusEqual(double,double)代替运算符+ = 10x到40x.哇.伤心.
这是一组时间:
Populating List<Element> took 320ms.
The PlusEqual() method took 105ms.
The 'same' += operator took 131ms.
The 'same' -= operator took 139ms.
The PlusEqual(double, double) method took 68ms.
The do nothing loop took 66ms.
The ratio of operator with constructor to method is 124%.
The ratio of operator without constructor to …Run Code Online (Sandbox Code Playgroud) 由于看似过早的Out of Memory异常,我们一直在仔细研究各种.NET构造的内存使用情况......特别是大型对象,这些对象倾向于分割大对象堆,导致过早的Out of Memory异常.一个有点令人惊讶的领域是.NET Image类:Bitmap和Metafile.
以下是我们认为已经学到的内容,但无法找到要验证的MS文档,因此我们希望其他人可以给予任何确认:
(1)当您从压缩的光栅文件(JPG,PNG,GIF等)创建Bitmap对象时,它会以该文件的完整分辨率为完全未压缩的像素阵列消耗内存.因此,例如,9000x3000像素的5MB JPG将扩展为9000x3000x3字节(假设为24位颜色,无alpha)或消耗81MB内存.正确?
(1a)有一些证据(见下面的2b)它也存储了原始的压缩格式......所以,在这种情况下实际上是86MB.但那还不清楚......有谁知道吗?
(2)当你创建一个Metafile对象,然后在其中绘制一个光栅文件(JPG,PNG,GIF等)时,它只消耗压缩文件的内存.因此,如果你在一个图元文件中绘制一个9000x3000像素的5MB JPG,它只会消耗大约5MB的内存.正确?
(2a)要将光栅文件绘制到Metafile对象中,唯一的方法似乎是使用该文件加载Bitmap,然后将Bitmap绘制到元文件中.有没有更好的方法不涉及临时加载巨大的位图数据(并导致相关的内存碎片)?
(2b)当您将位图绘制到图元文件时,它使用与原始压缩文件类似的压缩格式.它是通过将原始压缩文件存储在位图中来实现的吗?或者它是通过使用原始压缩设置重新压缩扩展的位图来实现的?
(3)我们最初假设大型(> 85KB)Image对象将被放置在Large Object Heap中.事实上,情况似乎并非如此.相反,每个Bitmap和每个Metafile都是Small Object Heap中的一个24字节对象,它指的是包含真实数据的Native Memory块.正确?
(3A),我们假设这样本机内存一样,它不能被压缩大对象堆......一旦大对象被放置到本机内存,它永远不会被移动,因此本机内存碎片会导致许多问题大对象堆的碎片化.真正?或者是否有更高效的底层Bitmap/Metafile数据的特殊处理?
(图3b)因此,似乎是被分开管理存储器四个独立块,并且耗尽每个可导致相同的内存例外的:小对象堆(管理对象<85KB,由GC压实),大对象堆(由GC回收,但不板结管理对象> 85KB),本机内存(非托管对象,想必不板结),以及桌面堆(其中窗口句柄和这种有限的资源管理).我是否正确记录了这四个?还有其他我们应该注意的吗?
任何人都可以提供上述任何清晰度将非常感激.如果有完整解释上述内容的好书或文章,请告诉我.(我很乐意做必要的阅读;但绝大多数书都没有那么深,所以不要告诉我任何我不知道的东西.)
谢谢!
当在XML中流式传输到XmlReader中时,我遇到了内存不足异常!查看内存分析器,我们可以看到它正在调用StringBuilder.Append一遍又一遍,导致大量128KB缓冲区填充了所有内存。
这与“流式传输”完全相反。它不应加载一个以上的4KB缓冲区。