Tag: 性能

附加调试器的C#代码非常慢; MemoryMappedFile的错?

我有一个客户端/服务器应用程序。 服务器组件运行,以“远程处理”方式使用WCF(二进制格式化程序,会话对象)。 如果我启动服务器组件并启动客户端,则服务器执行的第一项任务在<0.5秒内完成。 如果我在连接了VS调试器的情况下启动服务器组件,然后启动客户端,则任务需要20秒才能完成。 没有代码更改 – 没有条件编译更改。 无论我是否在32位,64位,VS主机进程,没有VS主机进程或这些东西的任何组合的情况下编译和运行服务器组件,都会出现同样的情况。 可能很重要 :如果我使用VS.NET 探查器 (采样模式),那么应用程序运行速度就像没有附加调试器一样。 所以我不能那样诊断它。 刚检查,仪表模式也快速运行。 对于并发性分析模式,同样快速。 关键数据: 该应用程序使用相当繁重的multithreading(标准线程池中有40个线程)。 无论如何创建线程都很快发生,并且不是一个慢点。 有许多锁, WaitHandle和Monitor模式 该应用程序完全没有例外。 该应用程序不会创建控制台输出 该应用程序完全是托管代码。 该应用程序确实将磁盘上的几个文件映射到MemoryMappedFile:1x750MB和12x8MB以及一些较小的文件 测量性能: 两种情况下CPU使用率都很低; 连接调试器时,CPU位于<1% 两种情况下内存使用都很少; 在这两种情况下可能都是50或60MB 发生了大量页面错误(参考MMF),但是在附加调试器时它们发生得更慢 如果没有使用VS主机进程,或者基本上“远程调试监视器”开始运行,则使用相当数量的CPU并产生大量页面错误。 但这不是问题发生的唯一时间 无论客户端如何运行,都会看到性能差异。 唯一要更改的变量是通过从Explorer启动的“Start with debugging”vs运行的服务器组件。 我的想法: 调试时WCF速度慢? MemoryMappedFiles在调试时会变慢吗? 使用了40个线程 – 调试速度慢? 也许Monitors / locks通知调试器? 线程调度变得奇怪/上下文切换非常罕见? 宇宙背景辐射赋予VS智慧和残酷的幽默感 所有人似乎都不太可能。 所以,我的问题: 为什么会这样? 如果#1未知,我该如何诊断/发现?

适用于.NET的最快PNG解码器

在将结果发送到Web客户端之前,我们的Web服务器需要将大量图像组合在一起。 此过程对性能至关重要,因为服务器每小时可以接收数千个请求。 现在我们的解决方案从HD加载PNG文件(每个大约1MB)并将它们发送到video卡,以便在GPU上完成合成。 我们首先尝试使用XNA API公开的PNG解码器加载我们的图像。 我们看到表现不太好。 要了解问题是从HD加载还是解码PNG,我们通过在内存流中加载文件,然后将该内存流发送到.NET PNG解码器来修改它。 使用XNA或使用System.Windows.Media.Imaging.PngBitmapDecoder类的性能差异并不重要。 我们大致得到了相同的性能水平。 我们的基准测试显示以下性能结果: 从磁盘加载图像:37.76ms 1% 解码PNG:2816.97ms 77% 在video硬件上加载图像:196.67ms 5% 成分:87.80ms 2% 从video硬件获取作曲结果:166.21ms 5% 编码为PNG:318.13ms 9% 存储到磁盘:3.96ms 0% 清理:53.00ms 1% 总计:3680.50ms 100% 从这些结果中我们看到最慢的部分是解码PNG时。 所以我们想知道是否会有我们可以使用的PNG解码器,这将允许我们减少PNG解码时间。 我们还考虑将图像保持在硬盘上不压缩,但是每个图像的大小为10MB而不是1MB,并且由于硬盘上存储了数万个这样的图像,因此无法存储它们。压缩。 编辑:更有用的信息: 基准测试模拟加载20个PNG图像并将它们合成在一起。 这大致对应于我们将在生产环境中获得的请求类型。 组合物中使用的每个图像的尺寸为1600×1600。 该解决方案将涉及多达10个负载均衡的服务器,就像我们在这里讨论的那样。 因此额外的软件开发工作可能值得节省硬件成本。 我们正在考虑缓存解码的源图像,但每种组合很可能使用完全不同的源图像完成,因此缓存未命中率高,性能提升低。 基准测试是用一个糟糕的video卡完成的,所以我们可以期待使用体面的video卡将PNG解码更加成为性能瓶颈。

在.NET中使用动态类型的性能成本

在.NET中使用dynamic vs object的性能成本是多少? 比方说,我有一个接受任何类型参数的方法。 例如 public void Foo(object obj) { } 要么 public void Foo(dynamic obj) { } ILSpy告诉我,在使用动态代码时,编译器必须插入代码块来处理动态。 因此,我想知道是否建议使用动态代替对象,以及这种用法以性能为代价的程度是多少?

使用属性和性能

我正在优化我的代码,我注意到使用属性(甚至是自动属性)会对执行时间产生深远的影响。 请参阅以下示例: [Test] public void GetterVsField() { PropertyTest propertyTest = new PropertyTest(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); propertyTest.LoopUsingCopy(); Console.WriteLine(“Using copy: ” + stopwatch.ElapsedMilliseconds / 1000.0); stopwatch.Restart(); propertyTest.LoopUsingGetter(); Console.WriteLine(“Using getter: ” + stopwatch.ElapsedMilliseconds / 1000.0); stopwatch.Restart(); propertyTest.LoopUsingField(); Console.WriteLine(“Using field: ” + stopwatch.ElapsedMilliseconds / 1000.0); } public class PropertyTest { public PropertyTest() { NumRepet = 100000000; […]

.NET中最快的GZIP解压缩库

哪个.NET库具有最快的解压缩性能(就吞吐量而言)? 那里有不少图书馆…… GZipStream DotNetZip Xceed Zip for .NET SevenZipLib SharpZipLib | Xceed Zip for .NET的社区赞助商 ……我希望还有更多我没有列出的。 有没有人看过这些GZIP库的吞吐量性能基准? 我对减压吞吐量很感兴趣,但我也希望看到压缩的结果。

与浮点数不一致的乘法性能

在.NET中测试浮点数的性能时,我偶然发现了一个奇怪的情况:对于某些值,乘法似乎比正常慢。 以下是测试用例: using System; using System.Diagnostics; namespace NumericPerfTestCSharp { class Program { static void Main() { Benchmark(() => float32Multiply(0.1f), “\nfloat32Multiply(0.1f)”); Benchmark(() => float32Multiply(0.9f), “\nfloat32Multiply(0.9f)”); Benchmark(() => float32Multiply(0.99f), “\nfloat32Multiply(0.99f)”); Benchmark(() => float32Multiply(0.999f), “\nfloat32Multiply(0.999f)”); Benchmark(() => float32Multiply(1f), “\nfloat32Multiply(1f)”); } static void float32Multiply(float param) { float n = 1000f; for (int i = 0; i < 1000000; ++i) […]

如何获取进程使用的CPU周期数

我需要使用C#(或VB.Net)获取特定进程使用的CPU周期数。 此信息可在Sysinternal的Process Explorer中的Process properties弹出窗口中找到。 例如,我正在使用post发布此消息的浏览器目前使用了18,521,360,165个cyles(给出或接受了几亿)。 有谁知道如何从.Net应用程序获取此信息? 我知道如何获得CPU使用率(百分比),但这不是我正在寻找的。 我需要一种方法来比较在不同时间运行的两个不同进程之间的CPU使用情况。 谢谢,马特 更新: 我为什么需要这个? 我是本地.Net用户组的领导者,我们正在运行代码挑战,开发人员提交代码来解决问题。 我需要一种方法来衡量一个条目与另一个条目的表现。 目前我正在使用计时器来衡量性能。 服务器100%专用于此,但这并不能保证可能同时发生其他事情。 显然,这是各种潜在问题,但总的来说,它是相当准确的。 测量所使用的CPU周期数将是一种几乎万无一失的方法来衡量某人的入口对另一个人的表现。 我确信有人可以在这一点上打洞 – 不需要在这一点上尝试。 ;-)我希望这有助于解释我的问题背后的原因以及为什么计时器不足以解决我的问题。

WPF DataGrid的性能问题

我正在测试WPF DataGrid,希望能够取代一些winforms控件,并且到目前为止对开发过程非常满意。 性能似乎是我现在最关心的问题。 我的开发工作站拥有市面上运行Windows 7的最佳CPU,拥有6台DDR3内存。 我正在替换的Windows控件响应速度更快,这令人担忧。 我的测试是绑定到ObservableCollection的DataGrid的基本实现,它每秒更新一次。 它还包括详细信息区域,可以展开以显示有关每行的更多信息。 详细信息区域只是一个stackPanel,其中ItemsControl包装TextBlock(重复6次) 我的抱怨是,如果我尝试滚动此集合,它通常是滞后的,如果我尝试扩展每一行,大约15%的点击不会触发按钮单击事件(DataGridTmplateColumn> CellTemplate> DataTemplate>按钮)如果某些行细节被展开,滚动也会更加抖动(滚动条可以自动resize) 有什么东西可以寻找/优化/避免? 更新 以下是我发现有用的一些要点: 尽可能少地依赖动态布局。 因为每个组件包含许多子组件并且在动态布局世界中,所有组件都必须调用可以是cpu密集型的测量和布局方法。 因此,不使用列宽Auto(或指定宽度),而是使用固定宽度 安装WPF Performance Suite并与您的应用程序呈现方式保持联系。 真棒的应用程序 正如Andrew所指出的那样,ListView是一个很好的选择,因为当你不需要高级DataGridfunction时,例如更新数据,或者可能是Details View(我仍然希望重现) 还有SuspendableObservableCollection非常适合在非常短的时间内添加多个项目(即0.01秒内的100个项目等) 经过大量测试,我发现BindingList比ObservableCollection快得多。 我在这里发布了由BindingList和Observable集合处理的相同负载的性能分析器快照,前者占用的CPU时间不到一半。 (请记住,这不仅仅是集合性能,而是与ListView配对时) 我的搜索仍在继续,因为我的应用程序中的某些内容似乎正在泄漏内存,并在几小时后将其降低到停止状态。

更快的位图对比度算法

我有一个带有轨迹栏滑块控件的工具,用于调整图像的亮度,对比度,伽玛等。 当用户拖动滑块时,我试图获得我的图像的实时更新。 亮度和伽玛算法是可接受的速度(大约170ms)。 但对比度算法大约是380ms。 基本上我的表单是一个带滑块的工具窗口。 每次更新图像时,它都会向父项发送一个事件,重新绘制新图像。 工具窗口将原始未修改的图像锁定在内存中,因此我始终可以访问它的字节。 因此,每次更改滑块的ValueChanged事件(例如“对比度”滑块)时,我都会这样做。 工作(目标)位图的LockBits为Format24bppRgb(原始位图在Format32bppPArgb中) Marshal。将位复制到byte []数组 检查我正在做的操作(选择了哪个滑块) 对比度使用以下代码: 码: double newValue = 0; double c = (100.0 + contrast) / 100.0; c *= c; for (int i = 0; i < sourcePixels.Length; i++) { newValue = sourcePixels[i]; newValue /= 255.0; newValue -= 0.5; newValue *= c; newValue += 0.5; newValue […]

C#生成IL for ++运算符 – 何时以及为什么前缀/后缀表示法更快

由于这个问题是关于增量运算符和带有前缀/后缀表示法的速度差异,我将非常谨慎地描述这个问题,以免Eric Lippert发现它并激怒我! (有关我所询问原因的更多信息和详细信息,请访问http://www.codeproject.com/KB/cs/FastLessCSharpIteration.aspx?msg=3899456#xx3899456xx/ ) 我有四个代码片段如下: – (1)单独,前缀: for (var j = 0; j != jmax;) { total += intArray[j]; ++j; } (2)单独,后缀: for (var j = 0; j != jmax;) { total += intArray[j]; j++; } (3)Indexer,Postfix: for (var j = 0; j != jmax;) { total += intArray[j++]; } (4)索引器,前缀: for (var j = […]