Tag: 性能

Cross AppDomain最低通信性能损失是多少?

我正在尝试最小化在同一台计算机上跨AppDomain进行通信的性能损失。 在我的玩具示例中,A类在AppDomain 1中加载。它创建一个AppDomain 2并在那里加载一个Class 2实例(Class 2inheritance自MarshalByRef)获取代理。 然后,Class 1重复调用代理上不返回任何值的方法。 我得到以下结果: 没有AppDomains,这两个类都加载在同一个AppDomain中,第一个调用是第二个方法(该方法没有参数): 2400万个方法调用/秒 如上所述的两个AppDomain,方法没有参数或“出血”字符串参数: 340.000方法调用/秒 如上所述的两个AppDomain,一个可序列化参数(两个字符串的数组): 64.000个方法调用/秒 虽然我理解2和3之间的性能损失(序列化),但我真的不明白为什么从案例1到案例2的速度要慢100倍 。 据我所知,一旦创建了代理,所有后续的方法调用必须非常快,因为没有数据从一个AppDomain编组到另一个AppDomain。 现在有人为什么要通过AppDomains进行通信这么慢? 难道我做错了什么? PS1。 我对此的唯一提示是:“跨越AppDomain边界的成本令人尴尬。” 我猜他指的是序列化…… PS2。 我不计算AppDomain或代理创建时间(我的基准测试从第一个方法调用开始) PS3。 我在WinXP SP3机器上使用.NET 3.5。 我也试过.NET 4.0 Beta 1没有显着差异。

将C ++结构编组到C#的最有效方法是什么?

我即将开始阅读大量的二进制文件,每个文件有1000个或更多记录。 不断添加新文件,因此我正在编写Windows服务来监视目录并在收到新文件时对其进行处理。 这些文件是用c ++程序创建的。 我在c#中重新创建了结构定义,可以很好地读取数据,但是我担心我这样做会最终导致我的应用程序死机。 using (BinaryReader br = new BinaryReader(File.Open(“myfile.bin”, FileMode.Open))) { long pos = 0L; long length = br.BaseStream.Length; CPP_STRUCT_DEF record; byte[] buffer = new byte[Marshal.SizeOf(typeof(CPP_STRUCT_DEF))]; GCHandle pin; while (pos < length) { buffer = br.ReadBytes(buffer.Length); pin = GCHandle.Alloc(buffer, GCHandleType.Pinned); record = (CPP_STRUCT_DEF)Marshal.PtrToStructure(pin.AddrOfPinnedObject(), typeof(CPP_STRUCT_DEF)); pin.Free(); pos += buffer.Length; /* Do stuff with my […]

C#WebClient第一次表现得很慢

我使用WebClient从网站下载一个字符串(只包含纯文本,没有别的),所以我使用DownloadString方法: WebClient wc = new WebClient(); string str = wc.DownloadString(“http://blah”); 它运行正常,但问题是它第一次下载字符串需要很长时间,比如5秒。 之后它运作得很快。 为什么会发生这种情况,如何解决这个问题呢?

WPF UI自动化问题

这个线程属于这个 我在问我需要从哪里插入解决方法 我有一个WPF应用程序,在Windows 7的某些客户端上存在性能问题。在Windows XP上,所有工作都很快。 该应用程序有一个MainShell和一些Child-Windows。 MainShell有时在某些机器上挂起,子窗口也是如此。 现在,我是否必须从所有窗口中的上述链接的线程中插入变通方法? 还有其他解决方法吗?

在类中添加是否会产生任何性能影响?

我需要将[Serializable]属性添加到对性能非常敏感的类中。 该属性是否会对类的操作产生任何性能影响?

LINQ:仅当值不为null时才添加where子句

我知道一种典型的方式是这样的: IQueryable query = from staff in dataContext.Staffs; if(name1 != null) { query = from staff in query where (staff.name == name1); } 但是,从我们从其他开发人员手中接过的程序中,我们看到了这样的代码: IQueryable query = from staff in dataContext.Staffs; query = from staff in query where (name1 == null || staff.name == name1); 如果这是一个普通的SQL语句,我肯定会说第二个是不好的做法。 因为当name1为null时,它会向查询添加无意义的where子句。 但我是LINQ的新手,所以我不确定LINQ是否有所不同?

如果有的话,使用System.Diagnostics.Stopwatch的资源惩罚是什么?

例如 foo() //Some operation bound by an external resource. db,I/O, whatever. 与 var watch = new Stopwatch(); watch.Start(); foo() var time = watch.ElapsedMilliseconds watch.Stop();

命名空间的数量是否会影响性能?

在Visual Studio中,有一个命令可以删除未使用的using语句 using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; 使用未使用的产品是否会受到性能影响?

C# – For vs Foreach – 巨大的性能差异

我正在对一个算法进行一些优化,该算法在给定的数组中找到大于X的最小数字,但随后ai偶然发现了一个奇怪的差异。 在下面的代码中,“ForeachUpper”在625ms结束,“ForUpper”结束,我相信,几个小时(疯狂地慢)。 为什么这样? class Teste { public double Valor { get; set; } public Teste(double d) { Valor = d; } public override string ToString() { return “Teste: ” + Valor; } } private static IEnumerable GetTeste(double total) { for (int i = 1; i d.Valor), test); Console.WriteLine(“————“); ForUpper(ieTeste.Select(d => d.Valor), test); Console.Read(); } private […]

调用空函数需要多长时间?

我有一个实现接口的项目列表。 对于这个问题,让我们使用这个示例界面: interface Person { void AgeAYear(); } 有两个class级 class NormalPerson : Person { int age = 0; void AgeAYear() { age++; //do some more stuff… } } class ImmortalPerson : Person { void AgeAYear() { //do nothing… } } 由于其他原因,我需要他们两个列表。 但是对于这个调用,当我循环遍历Person列表时,我可能正在调用空函数。 这会对性能产生影响吗? 如果是这样,多少钱? 对于所有意图和目的,空函数是否会被优化掉? 注意:在真实示例中, ImmortalPerson还有其他具有代码的方法 – 它不仅仅是一个什么都不做的对象。