Tag: 优化

在C#中确定未修剪字符串是否为空的最有效方法是什么?

我有一个字符串,周围可能有空白字符,我想检查它是否基本上是空的。 有很多方法可以做到这一点: 1 if (myString.Trim().Length == 0) 2 if (myString.Trim() == “”) 3 if (myString.Trim().Equals(“”)) 4 if (myString.Trim() == String.Empty) 5 if (myString.Trim().Equals(String.Empty)) 我知道这通常是一个过早优化的明显案例,但我很好奇,并且有可能做到这一点足以产生性能影响。 那么这些中最有效的方法是哪一种? 有没有更好的方法我没想过? 编辑:此问题的访问者注意事项: 对这个问题进行了一些非常详细的调查 – 特别是来自Andy和Jon Skeet。 如果你在搜索某些内容时偶然发现了这个问题,那么至少阅读Andy和Jon的post是非常值得的。 似乎有一些非常有效的方法, 最有效的方法取决于我需要处理的字符串的内容。 如果我无法预测字符串(在我的情况下我不能预测),Jon的IsEmptyOrWhiteSpace方法通常会更快。 谢谢大家的意见。 我将选择安迪的答案作为“正确”的答案仅仅是因为他应该为他所付出的努力赢得声誉,而Jon已经拥有了十亿美元的声誉。

我应该关注.NET字典的速度吗?

我将创建一个将使用字典查找和插入相当多的项目。 这是值得关注的吗? 此外,如果我进行基准测试等并且它真的很糟糕,那么用其他东西替换字典的最佳方法是什么? 使用带有“哈希”键的数组会更快吗? 那会对插入时间有所帮助吗? 此外,我不认为我是微优化的,因为这确实是生产服务器上代码的重要组成部分,因此如果需要额外的100毫秒才能完成,那么我们将寻找新的方法来处理这个问题。

在.Net中,出于性能原因,我是否应该通过引用传递结构?

在我的C#应用​​程序中,我有一个大型结构(176字节),每秒可能传递一十万次到一个函数。 然后,该函数只需要一个指向struct的指针,并将指针传递给非托管代码。 函数和非托管代码都不会对结构进行任何修改。 我的问题是,我应该通过值或引用将结构传递给函数吗? 在这种特殊情况下,我的猜测是,通过引用传递比将176个字节推入调用堆栈要快得多,除非JIT碰巧认识到结构永远不会被修改(我的猜测是因为结构体的结构不能识别它)地址被传递给非托管代码)并优化代码。 既然我们正在使用它,那么我们还要回答更常见的情况,即函数没有将struct的指针传递给非托管代码,而是对struct的内容执行一些只读操作。 通过引用传递结构会更快吗? 在这种情况下,JIT会认识到结构永远不会被修改,从而进行优化吗? 据推测,通过引用传递1字节结构并不是更有效,但是如果有的话,通过引用传递结构会变得更好吗? 谢谢。 编辑: 如下所述,还可以为常规使用创建“等效”类,然后在传递给非托管代码时使用结构。 我在这里看到两个选项: 1)创建一个简单包含结构的“包装器”类,然后在必要时将指向结构的指针传递给非托管代码。 我看到的潜在问题是钉扎有其自身的性能影响。 2)创建一个等价的类,当需要struct时,其字段被复制到struct。 但是复制需要花费很多时间,而且在我看来首先要通过引用来打败它。 编辑: 正如下面提到的几次,我当然可以只测量每种方法的性能。 我会这样做并发布结果。 但是,我仍然有兴趣从知识的角度看待人们的答案和推理。

为什么重用DataContext会对性能产生负面影响?

经过大量 研究和一些错误后 ,我修改了我的代码,以便每次查询数据库或插入数据时都会创建一个新的DataContext。 并且经常查询数据库 – 对于处理的250k个事务中的每一个,在插入事务之前,将查询数据库以获取客户ID,部门ID和类别。 所以现在我正在尝试优化代码,因为它每秒只处理大约15个事务。 我删除了一些无关的查询并添加了一些索引,并将其提高到30 /秒。 然后我想,尽管每个人都说DataContext是轻量级的,但是每个事务需要花费4倍的时间来创建一个新的,所以我尝试重用DataContext。 我发现,令我惊讶的是,重复使用上下文会导致性能降低到每秒10个事务! 为什么会这样呢? 是因为DataContext将实体缓存在内存中,并在查询数据库之前首先搜索其内存列表? 因此,例如,如果我正在寻找名为“MCS”的客户的客户ID(主键),并且客户名称列上有聚簇索引,以便数据库查询速度快,则内存中查找会慢吗? 创建/部署如此多的数据库连接是否会降低速度,或者这只是另一种过早的优化? 如果确实如此,是否有办法重用DataContext但是它为每个linq-to-sql查询执行实际的数据库查询?

跨多个控件共享事件处理程序

在用C#编写的Windows窗体应用程序中,我有一堆按钮。 当用户的鼠标hover在按钮上时,我希望按钮的边框发生变化。 目前我有以下多个实例(每个按钮的副本): private void btnStopServer_MouseEnter(object sender, EventArgs e) { oldColor = btnStopServer.FlatAppearance.BorderColor; btnStopServer.FlatAppearance.BorderColor = mouseOverColor; } private void btnStopServer_MouseLeave(object sender, EventArgs e) { btnStopServer.FlatAppearance.BorderColor = oldColor; } 由于我有很多按钮,更改按钮边框颜色的代码占用了大量空间。 有没有更简单的方法可以做到这一点?

项目Euler:问题1(可能的重构和运行时优化)

我听过很多关于Project Euler的消息,所以我想我解决了C#中的一个问题。 网站上所述的问题如下: 如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9.这些倍数的总和是23。 求出1000以下3或5的所有倍数的总和。 我编写了如下代码: class EulerProblem1 { public static void Main() { var totalNum = 1000; var counter = 1; var sum = 0; while (counter < totalNum) { if (DivisibleByThreeOrFive(counter)) sum += counter; counter++; } Console.WriteLine("Total Sum: {0}", sum); Console.ReadKey(); } private static bool DivisibleByThreeOrFive(int counter) { return ((counter % 3 == […]

arrays边界检查CLR中的消除?

我最近阅读了Dave Detlefs的这篇文章 ,其中他介绍了一些CLR执行数组边界检查消除的情况。 我决定自己测试一下,所以我做了以下几点: 打开Visual Studio 2010 Ultimate SP1 创建了一个类型为Console Application的新C#项目(默认情况下以.NET 4 Client Profile为目标) 添加了以下代码(所有子方法都直接来自文章): class Program { static void Main(string[] args) { int[] array = new int[30]; Test_SimpleAscend(array); Test_SimpleRedundant(array, 3); foreach (int i in array) { Console.WriteLine(i); } } static void Test_SimpleAscend(int[] a) { for (int i = 0; i < a.Length; i++) a[i] […]

用于在C#2.0中同步两个IList的最佳算法

想象一下以下类型: public struct Account { public int Id; public double Amount; } 在C#2.0中同步两个IList的最佳算法是什么? (没有linq)? 第一个列表(L1)是引用列表,第二个列表(L2)是根据第一个列表同步的列表: 必须从L2中删除L2中不再存在的L2中的所有帐户 必须更新L1中仍存在于L1中的所有帐户(金额属性) 所有在L1中但尚未在L2中的帐户必须添加到L2 ID标识帐户。 找到一个天真的工作算法并不难,但我想知道是否有一个智能解决方案来处理这种情况而不会破坏可读性和性能。 编辑 : 帐户类型无关紧要,可以是类,具有属性,平等成员等。 L1和L2未排序 L2项目不能被L1项目替换,必须更新(逐个字段,属性按属性)

使用单个值填充数组的最快方法

我想用我所拥有的单个值来填充2D数组,但是,我想尽可能以最快的方式完成2D数组的长度总计200k +并且随着时间的推移将有超过200个这样的数组。 我已经查看了Buffer.BlockCopy和Array.Copy,但是,它们都将数组作为源/目标,其中我唯一的数组是目标,源是单个值。 填充数组的最快方法是源是单个值而不是数组?

C#do字符串文字是否由编译器优化?

C#编译器或.NET CLR是否对字符串文字/常量进行了任何巧妙的内存优化? 我可以发誓我听说过“字符串内化”的概念,所以在程序的任何两位代码中,字面意思“这是一个字符串”实际上是指同一个对象(大概是安全的,字符串是什么一成不变的?)。 我在谷歌上找不到任何有用的参考资料…… 我听错了吗? 别担心 – 我的代码中没有用这些信息做任何可怕的事情,只是想更好地了解它的工作原理。