Tag: performance

高效克隆缓存的对象

我们有一个应用程序,它对数据对象进行比较,以确定对象的一个​​版本是否与另一个版本不同。 我们的应用程序也对这些对象进行了一些广泛的缓存,在进行这些比较时我们遇到了一些性能问题。 这是工作流程: 数据项1是内存中的当前项。 此项最初是从缓存中检索并进行深度克隆(所有子对象,如字典等)。 然后编辑数据项1,并修改其属性。 然后,我们将此对象与存储在缓存中的原始版本进行比较。 由于数据项1已克隆且其属性已更改,因此这些对象应该不同。 这里有几个问题。 主要问题是我们的深度克隆方法非常昂贵。 我们对浅色克隆进行了分析,速度慢了10倍。 那是废话。 这是我们深度克隆的方法: public object Clone() { using (var memStream = new MemoryStream()) { var binaryFormatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone)); binaryFormatter.Serialize(memStream, this); memStream.Seek(0, SeekOrigin.Begin); return binaryFormatter.Deserialize(memStream); } } 我们最初使用以下内容进行克隆: public object Clone() { return this.MemberwiseClone(); } 这样做效率更高,但是因为它做了浅层克隆,所有作为此对象属性的复杂对象(如字典等)都没有被克隆。 该对象仍将包含与缓存中的对象相同的引用,因此在比较时属性将相同。 那么,有没有人有一种有效的方法在C#对象上进行深度克隆,这将克隆整个对象图?

哪个有更好的表现? 静态与对象

我设计了一个C#控制台应用程序,使用OOP设计合并和拆分大文件(大小约4GB)。 它涉及读/写xml,平面文件和图像。 我为读者和作家提供课程。 合并时间约为00:12,而分裂时间超过04:30。 然后,我通过将输出文件分发到子目录而不是使用单个目录,将分割的性能提高到00:50。 我的老板要求我将所有内容转换为静态过程编程,而不是对象。 他说00:12合并比较00:50分裂是不平衡的。 他希望在00:30分钟完成分裂,转换成静态。 现在我知道静态调用会更快。 但是我不同意所有静态都会更好,因为我必须在方法中使用“ref”和“out”参数。 我的问题是: 将文件拆分到子目录的原因比使用单个输出目录快得多? (即大量文件> 200,000) 有没有比将代码从对象转换为静态更好的方法,以实现更高的性能?

WebClient下载字符串(几个字符页面)太慢了

我正在尝试从URL下载字符串。 不幸的是,它很慢。 这是我的代码: // One of these types for two bad solutions anyway // byte[] result = new byte[12]; // string result; using (var webClient = new System.Net.WebClient()) { String url = “http://bg2.cba.pl/realmIP.txt”; //result = webClient.DownloadString(url); // slow as hell //webClient.OpenRead(url).Read(result, 0, 12); // even slower } 这需要大约4-5秒,这对我来说似乎非常不合适…… 该url的内容为IP XX.YYY.ZZ.FF

azure色的服务面料可靠的字典linq查询非常慢

我在服务结构状态服务中有一个可靠的字典。 我有一个简单的linq表达式。 我正在使用Ix-Async包来构建一个asyncenumerable。 using (ITransaction tx = this.StateManager.CreateTransaction()) { var result = (await customers.CreateLinqAsyncEnumerable(tx)) .Where(x => x.Value.NameFirst != null && x.Value.NameFirst.EndsWith(n, StringComparison.InvariantCultureIgnoreCase)) .Select(y => y.Value); return await result.ToList(); } 数据分为2个分区,每个分区约有75,000条记录。 我使用Int64范围作为分区键。 在上面的代码中,“Result.ToList()”大约需要1分钟来执行每个分区。 另一个问题是,实际结果是空的! 在sql server中运行的相同sql返回客户名以“c”结尾的行。 但是,这是重点。 我最关心的是“ReliableDictionary”linq查询的性能。 问候

极低的FPS,我应该使用什么样的分析应用程序来查找性能问题?

我正在创建一个XNA游戏并获得意想不到的结果,极低的FPS(约2-12 fps)。 我应该使用什么程序来测试性能并找出降低速度的程序?

.Net TableLayoutPanel – 清除控件非常慢

这很简单。 我有一个基于数据库查询填充控件(只是标签,按钮和一些带按钮的面板)的TableLayoutPanel。 当需要刷新数据时,我使用TableLayoutPanel.Controls.Clear()。 不幸的是,这是一个非常缓慢的操作。 我希望它比填充表格的代码更快,但它至少要慢3到4倍。 我明确地certificate了缓慢是在执行Controls.Clear()时执行此操作,因为在显示消息框之后对TableLayoutPanel执行了一次操作(然后程序返回)。 控制从底部向上明显消失。 当记录集用于重新填充TableLayoutPanel时,从上到下出现的控件的速度几乎比我看到的要快。 我已经在做TableLayoutPanel.SuspendLayout()和ResumeLayout()。 在窗体上使用this.DoubleBuffered = true似乎没有做任何事情。 我可以通过代码处理整个控件并重新创建它,但这是一个很大的痛苦,并使一个漂亮的表单设计器GUI毫无意义。 我将不得不深入研究我在控件上设置的每个属性并为其创建一行代码(虽然我想我可以从设计器代码本身中获取它,但它仍然感觉不对)。 关于如何更快地完成工作的任何想法? 我甚至愿意使用除TableLayoutPanel之外的其他方法…我只需要自由地为每个单元格放置多个按钮或禁止它能够跨越表头中的列。 C#在重绘时能否至少冻结整个表格,然后一次全部绘制?

CommandBehavior.SequentialAccess是否有任何性能提升?

我意识到我总是按索引返回的顺序读取我的字段(使用常量)。 所以据我所知,我的代码已经与CommandBehavior.SequentialAccess兼容。 如果我打开它会有任何好处吗? DataReader只是前传,只读是真正的性能增益吗?

为什么我的C#程序在分析器中更快?

我有一个相对较大的系统(到目前为止约25000行)用于监控无线电相关设备。 它使用最新版本的ZedGraph显示图表等。 该程序使用Win7上的VS2010上的C#进行编码。 问题是: 当我从VS内部运行程序时,它运行缓慢 当我从内置的EXE运行程序时,它运行缓慢 当我通过Performance Wizard / CPU Profiler运行程序时,它会运行Blazing Fast。 当我从构建的EXE运行程序,然后启动VS并将探查器附加到任何其他进程时,我的程序加速了! 我希望程序能够快速运行! 解决方案中的每个项目都设置为RELEASE,Debug非托管代码是DISABLED,定义DEBUG和TRACE常量是DISABLED,优化代码 – 我试过,警告级别 – 我试过,抑制JIT – 我试过了,总之我尝试了所有已经在StackOverflow上提出的解决方案 – 没有成功。 程序在分析器外部很慢,在分析器中很快。 我不认为问题出在我的代码中,因为如果我将探查器附加到其他不相关的进程中它会变得很快! 请帮忙! 我真的需要它在各地都那么快,因为它是一个关键业务应用程序,性能问题是不能容忍的…… 更新1 – 8跟随 ——————– UPDATE1:——————– 问题似乎与ZedGraph无关,因为在我用自己的基本绘图替换ZedGraph之后它仍然存在。 ——————– UPDATE2:——————– 在虚拟机中运行该程序,程序仍然运行缓慢,并且从主机运行的探查器不会使它快速。 ——————– UPDATE3:——————– 启动屏幕捕获到video也可以加快程序的速度! ——————– UPDATE4:——————– 如果我打开英特尔图形驱动程序设置窗口(这个东西: http : //www.intel.com/support/graphics/sb/img/resolution_new.jpg ),只是不断地将光标hover在按钮上,这样它们就会发光,等等,我的节目加快了! 如果我运行GPUz或Kombustor,它不会加速,所以没有GPU上的超频 – 它保持稳定850Mhz。 ——————– Update5:——————– 测试不同的机器: – 在配备Intel HD2000的Core […]

CPU未得到充分利用。 由于阻塞I / O?

我试图找到C#服务器应用程序瓶颈未充分利用的地方。 我认为这可能是由于磁盘I / O性能不佳而与应用程序本身无关,但我无法从这个假设中得出一个事实。 应用程序从本地MSMQ队列中读取消息,对每条消息进行一些处理,并在处理完消息后,将响应消息发送到另一个本地MSMQ队列。 我正在使用异步循环从队列中读取消息,尽可能快地将它们出列并使用Task.Run调度它们进行处理以启动每个消息的处理(并且不要等待此Task.Run …只是附加一个延续只记错了记录错误)。 每个消息被同时处理,即在处理下一个消息之前不需要等待消息被完全处理。 在处理消息的最后,我使用MessageQueue的Send方法(不知何故异步但不是真的因为它必须等待磁盘写入才能返回-see System.Messaging – 为什么MessageQueue不提供异步版本的Send )。 对于基准测试,我在队列中排队100K消息(100K消息的总大小约为100MB)然后我启动程序。 在我的两台个人计算机上(一台SSD HD和另一台SATA2 HD,i7 CPU四核-8逻辑处理器) – 我在程序生命周期内达到~95%的CPU使用率(将100K消息出列,处理它们和发送回复)。 消息尽可能快地出列,尽可能快地处理(这里涉及的CPU),然后对发送到不同本地队列的每个消息进行响应。 现在在一个运行非HT双核CPU的虚拟机上(不知道什么是底层磁盘,但看起来远不如地雷……在基准测试期间,使用Perfmon我可以看到avg disk sec / write arround 10-15 ms on this VM,虽然我的个人机器上是2ms左右)当我运行相同的工作台时,我只能达到~55%的CPU(当我在机器上运行相同的工作台时没有向队列发送响应消息我达到~90%CPU )。 我真的不明白这里有什么问题。 似乎很清楚,向队列发送消息是问题并且减慢了程序的全局处理(以及要处理的消息的队列化),但为什么会考虑我使用Task.Run来启动每个出列消息的处理并最终响应发送,我不希望CPU未被充分利用。 除非一个线程正在发送消息时阻止其他线程在等待返回(磁盘写入)时在同一个核心上运行,在这种情况下,考虑到延迟远远高于我的个人计算机,它可能是有意义的,但是一个线程等待I / O不应该阻止其他线程运行。 我真的想了解为什么我没有达到这台机器至少95%的CPU使用率。 我盲目地说这是由于较差的磁盘I / O性能,但我仍然不明白为什么它会导致CPU利用不足,因为我正在使用Task.Run同时运行处理。 它也可能是一些与磁盘完全无关的系统问题,但考虑到MessageQueue.Send似乎是问题,并且此方法最终将消息写入内存映射文件+磁盘,我看不出性能问题可能来自何处除了磁盘。 当然,由于程序最大限度地提高了我自己计算机上的CPU使用率,因此确实存在系统性能问题,但我需要找到VM系统上的瓶颈,以及为什么它会影响我的应用程序的并发/速度。 任何的想法 ?

使用Httprequest从给定的URL获取图片

我正在尝试从网络摄像头获取图片。 有一个php-python Web服务来从网络摄像头获取图片并为它们提供服务:它提供了像http://ip/jpeg/camera=1 。 private HttpWebRequest request; private HttpWebResponse response; private CookieContainer container; private Uri uri; private string _user; private string _pass; private string _ip; //Login code as seen in the previous section should be here //GetImages is meant to run as a separate thread private void GetImages(string camNo) { //create the GET request for […]