Tag: 性能

在.NET中具有深度inheritance的类的内存分配

如果我有类A, B, C, D, E ,以及X, Y, Z和模型等接口,那么系统就像: class B : A, X class C : B, Y class D : C, Z class E : D 如果A是一个抽象基类而E是感兴趣的类,当我创建一个E实例时,它会依次创建A, B, C, D, X, Y, Z实例吗? 如果是这种情况,这会产生巨大的性能开销吗? 不是内存,而是运行时和GC明智。

如何找到处置和内存问题? C#

我的应用程序不久前使用的是150mb内存,现在是286mb。 它慢慢上升所以我必须忘记处理某些东西。 这对我来说不是一个问题,因为我有4gb,但我想把它发送给只有1gb内存的其他人。 然后逐行检查代码我怎样才能找到需要处理的对象或者只是一般大的对象?

为什么在这个例子中LINQ更快

我写了以下内容来测试使用foreach vs LINQ的性能: private class Widget { public string Name { get; set; } } static void Main(string[] args) { List widgets = new List(); int found = 0; for (int i = 0; i a.Name.StartsWith(“4″)).Count(); Console.WriteLine(found + ” – ” + DateTime.Now.Subtract(starttime).Milliseconds + ” ms”); Console.ReadLine(); } 我得到类似以下输出: 31160 – 116ms 31160 – 95毫秒 […]

创建运行时确定类型实例的最佳方法

在.NET 4中创建在运行时确定的类型实例的最佳方法是什么? 我有一个实例方法,虽然作用于BaseClass对象可能会被其派生类的实例调用。 我需要在方法中创建与this类型相同的另一个实例。 为每个派生类重载Method是不切实际的,因为它相当复杂,并且更有效地保持单个实现。 public class BaseClass { //constructors + properties + methods etc public SomeMethod() { //some code DerivedClass d = new DerivedClass(); //ideally determine the DerivedClass type at run-time } } 我已经阅读了一些关于reflection或使用动态关键字但我没有这些经验。

C#List vs IEnumerable 性能问题

嗨,假设这两种方法: private List GetProviderForType(Type type) { List returnValue = new List(); foreach (KeyValuePair provider in _objectProviders) { if ((provider.Key.IsAssignableFrom(type) || type.IsAssignableFrom(provider.Key)) && provider.Value.SupportsType(type)) { returnValue.Add(provider.Value); } } return returnValue; } private IEnumerable GetProviderForType1(Type type) { foreach (KeyValuePair provider in _objectProviders) if ((provider.Key.IsAssignableFrom(type) || type.IsAssignableFrom(provider.Key)) && provider.Value.SupportsType(type)) yield return provider.Value; } 哪一个更快? 当我看第一种方法时,我看到内存是为List分配的,我认为不需要它。 IEnumerable方法似乎对我来说更快。 例如,假设你打电话 int […]

什么时候会并行提高性能

我试图理解何时使用parallel会提高性能。 我使用在List中运行超过100,000个项目的简单代码对其进行了测试,并将每个项目的名称更改为string.Empty 。 并行版本比普通版本花费了两倍的时间。 (是的,我测试了更多的核心…) 我看到这个答案说一段并不总是并行的数据对性能有好处。 此外,在MSDN教程的并行示例的每一页中都会重复此注意事项: 这些示例主要用于演示用法,可能会或可能不会比等效的LINQ to Objects查询运行得更快 我需要一些规则和提示,当并行将提高我的代码的性能,什么时候不会。 显而易见的答案是“测试你的代码,如果并行循环更快地使用它”,这是绝对正确的,但我想没有人在他写的每个循环上运行性能分析。

如何在C#中有效地从另一个中减去一个巨大的列表

我有一个很长的Ids(整数)列表,它代表了我数据库中当前的所有项目: var idList = GetAllIds(); 我还有另一个巨大的通用列表,其中包含要添加到数据库的项目: List itemsToAdd; 现在,我想删除ID已经在idList中的通用列表中的所有项目。 目前idList是一个简单的数组,我减去这样的列表: itemsToAdd.RemoveAll(e => idList.Contains(e.Id)); 我很确定它可以快得多,所以我应该为两个集合使用什么数据类型以及减去它们的最有效做法是什么? 谢谢!

快速video显示WPF

我正在开发一个WPF应用程序,需要以快速帧速率显示多个video流(我们希望30 fps)。 video流是1920×1080原始(RGB24)帧(它们存储在System.Drawing.Bitmap中)。 有没有人对如何实现这一点有任何想法? 更多细节: 我们之前的尝试使用了标准的WPF图像控件,改变了每帧的源。 这适用于单个流,但现在我们必须渲染多个流,它正在放慢速度。 我们还尝试使用Direct2D来处理绘图,使用D3D9共享曲面作为Image控件的源。 虽然这个速度更快,但我们仍然无法从中获得稳定的30fps(当事情恢复时它会在24-32 fps之间跳跃)。 video流在后台线程中进入,然后被封送(使用窗口的Dispatcher)到适当的UI线程进行绘制。 然后在UI线程上完成所有绘图。 我们还尝试为每个窗口提供自己的线程。 如果有人想看,我可以提供我们尝试过的代码示例。 谢谢!

C#中的高性能文件复制?

我有一个大约500k jpg文件的庞大目录,我想归档所有早于某个日期的文件。 目前,该脚本需要数小时才能运行。 这与GoGrid的存储服务器非常糟糕的性能有很大关系,但与此同时,我确信有一种方法可以更有效地实现Ram / Cpu,以实现我正在做的事情。 这是我的代码: var dirInfo = new DirectoryInfo(PathToSource); var fileInfo = dirInfo.GetFiles(“*.*”); var filesToArchive = fileInfo.Where(f => f.LastWriteTime.Date = StopThresholdInDays.Days().Ago().Date ); foreach (var file in filesToArchive) { file.CopyTo(PathToTarget+file.Name); } Days()。Ago()的东西只是语法糖。

如何在.NET中最有效地利用多个内核进行简短计算?

下面是上下文:我正在用C#编写一个名为Heron的小编程语言的解释器,它有一些可以并行执行的原始列表操作。 我面临的最大挑战之一是,只要遇到可并行化的操作,就可以有效地将评估者完成的工作分配到不同的核心。 这可以是短期或长期操作,很难提前确定。 我不必担心的一件事是同步数据:显然不允许并行操作修改数据。 所以我的主要问题是: 跨线程分配工作的最有效方法是什么,这样我才能保证计算机将工作分配到两个核心? 我也对相关问题感兴趣: 在我们开始克服将工作分离到另一个线程的开销之前,操作需要多长时间?