Tag: 性能

表达树的表现

我目前的理解是这样的’硬编码’代码: public int Add(int x, int y) {return x + y;} 将始终比表达式树代码执行更好,如下所示: Expression<Func> add = (x, y) => x + y; var result = add.Compile()(2, 3); var x = Expression.Parameter(typeof(int)); var y = Expression.Parameter(typeof(int)); return (Expression.Lambda(Expression.Add(x, y), x, y). Compile() as Func)(2, 3); 因为编译器有更多的信息,如果你在编译时编译它,可以花更多的精力来优化代码。 这一般是正确的吗?

entity framework包括性能

我一直在关注entity framework的性能,特别是关于使用Includes以及生成和执行各种查询所花费的时间。 我将详细介绍我所做的更改,但如果您认为任何这些假设是错误的,请纠正我。 首先,我们在数据库中有大约10,000个项目(不是很多),并且数据库显着标准化(这导致了大量的导航属性)。 目前的方法是延迟加载所有内容,并且假设请求一个项目可以假脱机数十个db请求,性能非常差,特别是对于较大的数据集。 (这是一个inheritance的项目,第一步是尝试在没有重大重组的情况下提高性能) 因此,我的第一步是获取查询结果,然后仅将导航属性的包含应用于这些结果。 我知道这在技术上执行了2个查询,但是如果我们存储了10,000个项目,但只想返回10个项目,那么仅在这10个项目中包含导航属性更有意义。 其次,在查询结果上使用多个包含且结果集大小非常大的情况下,仍然会遇到性能不佳的问题。 关于什么时候需要加载以及何时将延迟加载到位,我一直很务实。 我的下一个更改是批量加载查询包含,因此执行: query.Include(q => q.MyInclude).Load(); 这再一次显着提高了性能,虽然还有一些db调用(每批包含一个),它比大型查询更快,或者至少减少了entity framework尝试生成大型查询的开销。 所以代码现在看起来像这样: var query = ctx.Filters.Where(x => x.SessionId == id) .Join(ctx.Items, i => i.ItemId, fs => fs.Id, (f, fs) => fs); query .Include(x => x.ItemNav1) .Include(x => x.ItemNav2).Load(); query .Include(x => x.ItemNav3) .Include(x => x.ItemNav4).Load(); query .Include(x => x.ItemNav5) .Include(x […]

C#中的通用与非通用性能

我写了两个等价的方法: static bool F(T a, T b) where T : class { return a == b; } static bool F2(A a, A b) { return a == b; } 时间差异: 00:00:00.0380022 00:00:00.0170009 测试代码: var a = new A(); for (int i = 0; i < 100000000; i++) F(a, a); Console.WriteLine(DateTime.Now – dt); dt = DateTime.Now; […]

从SqlDataReader读取字符串时内存不足

我遇到了一些我无法弄清楚的最奇怪的事情。 我有一个SQL表,其中包含一堆存储在ntext字段中的报告。 当我将其中一个的值复制并粘贴到记事本中并保存它时(使用Visual Studio从不同行中的较小报告中获取值),原始txt文件大约为5Mb。 当我尝试使用SqlDataReader获取相同的数据并将其转换为字符串时,我得到一个内存不足exception。 以下是我尝试这样做的方法: string output = “”; string cmdtext = “SELECT ReportData FROM Reporting_Compiled WHERE CompiledReportTimeID = @CompiledReportTimeID”; SqlCommand cmd = new SqlCommand(cmdtext, conn); cmd.Parameters.Add(new SqlParameter(“CompiledReportTimeID”, CompiledReportTimeID)); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { output = reader.GetString(0); // <— exception happens here } reader.Close(); 我尝试创建一个对象和一个stringbuilder来获取数据,但我仍然得到相同的内存不足exception。 我也试过使用reader.GetValue(0).ToString()也无济于事。 查询只返回1行,当我在SQL Management Studio中运行时,它尽可能快乐。 抛出的exception是: System.OutOfMemoryException was […]

如何查找列表中的元素是否在另一个列表中?

我想知道在第二个列表中是否可以找到第一个列表中的至少一个元素。 我可以看到两种方法。 假设我们的列表是: List list1 = new[] { “A”, “C”, “F”, “H”, “I” }; List list2 = new[] { “B”, “D”, “F”, “G”, “I” }; 第一种方法使用循环: bool isFound = false; foreach (item1 in list1) { if (list2.Contains(item1)) { isFound = true; break; } } 第二个直接使用Linq: bool isFound = list1.Intersect(list2).Any(); 第一个是写的很长,而不是非常直接/易于阅读。 第二个是短而清晰的,但表现很低,特别是在大型名单上。 这可能是一种优雅的方式吗?

结合多个文本文件的有效方法

我有多个文本文件需要阅读并合并到一个文件中。 文件大小不一:每个1到50 MB。 什么是组合这些文件的最有效方法,而不会碰到恐惧System.OutofMemoryException ?

.NET HttpWebRequest速度与浏览器

我有一个关于.Net HttpWebRequest客户端(或WebClient,给出类似结果)的性能的问题。 如果我使用HttpWebRequest请求一个html页面(在本例中为news.bbc.co.uk)并分析应用程序读取响应的速度(使用HttpAnalyzer),这比浏览器慢得多(Firefox,Chrome) ,IE)请求相同的资源(清除所有缓存等)。 .Net应用程序大约需要1.7秒,而浏览器需要0.2 – 0.3秒。 这纯粹取决于代码/应用程序的速度和效率,还是还有其他因素需要考虑? 代码如下: HttpWebRequest request = null; Uri uriTest = new Uri(“http://news.bbc.co.uk”); request = (HttpWebRequest)WebRequest.Create(uriTest); request.Method = “GET”; request.KeepAlive = true; request.Headers[“Accept-Encoding”] = “gzip, deflate”; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); response.Close();

用于比较XML节点的高效算法

我想确定XML文档中的两个不同的子节点是否相等。 如果两个节点具有相同的属性集和子注释,并且所有子注释也相等(即整个子树应该相等),则应认为它们是相等的。 输入文档可能非常大(最多60MB,超过100000个节点需要比较)并且性能是个问题。 检查两个节点是否相等的有效方法是什么? 例: Hello World 此XML片段描述了OpenXML文档中的段落。 该算法将用于确定文档是否包含具有与文档前面的另一段相同属性(w:pPr节点)的段落(w:p节点)。 我有一个想法是将节点的外部XML存储在一个哈希集中(通常我必须首先得到一个规范的字符串表示,其中属性和子注释总是以相同的方式排序,但我可以期望我的节点已经到以这种forms)。 另一个想法是为每个节点创建一个XmlNode对象,并编写一个比较所有属性和子节点的比较器。 我的环境是C#(。Net 2.0); 我们非常欢迎任何反馈和进一步的想法。 也许有人甚至已经有了一个很好的解决方案? 编辑:微软的XmlDiff API实际上可以这样做,但我想知道是否会有一个更轻量级的方法。 XmlDiff似乎总是产生一个diffgram,并且总是先生成一个规范的节点表示,这两件事我都不需要。 EDIT2:我最终根据这里提出的建议实现了我自己的XmlNodeEqualityComparer。 非常感谢!!!! 谢谢,divo

提高ASP.NET应用程序的性能

如何提高ASP.NET应用程序的性能? 我应该注意哪些领域? 该应用程序包括数据库连接和图像分析等。

优化DateTime.Now的替代方案

我和一位同事在这个问题上来回走动,我希望得到一些外界意见,看看我提出的解决方案是否是一个好主意。 首先,免责声明:我意识到“优化DateTime.Now ”的概念对你们中的某些人来说听起来很疯狂。 我有几个先发制人的防御措施: 我有时会怀疑那些总是说“计算机速度快;可读性总是在优化之前”的人经常会从开发应用程序的经验中说出,虽然这些应用程序可能很重要但性能并不重要 。 我说的是要尽可能接近瞬间发生事情 – 比如,在几纳秒内(在某些行业中,这很重要 – 例如,实时高频交易)。 即使考虑到这一点,我在下面描述的替代方法实际上是非常易读的。 这不是一个奇怪的黑客,只是一个可靠而快速工作的简单方法。 我们有跑步测试。 DateTime.Now 很慢(相对来说)。 下面的方法更快。 现在,问题本身。 基本上,通过测试,我们发现DateTime.Now大约需要25个滴答(大约2.5微秒)才能运行。 当然,这是平均数千到数百万次通话的平均值。 看起来第一个呼叫实际上需要花费大量时间,后续呼叫要快得多。 但仍然是25个蜱是平均值。 然而,我和我的同事注意到DateTime.UtcNow运行的时间要少得多 – 平均只有0.03微秒。 鉴于我们的应用程序永远不会在夏令时发生变化时运行 ,我的建议是创建以下类: public static class FastDateTime { public static TimeSpan LocalUtcOffset { get; private set; } public static DateTime Now { get { return DateTime.UtcNow + LocalUtcOffset; } } static […]