Tag: 性能

处理连接或关闭连接

以下两种方法中哪一项具有更好的性能? using( var DB_Connection_s = new DBConnection() ) { //todo: interact with database connection } 要不就 : DB_Connection_s.Close(); 在末尾。 第一种方法是否使汇集概念无用? 因为如果我为每次使用处理连接,那么我每次都必须打开一个新连接(并且池中没有任何连接)。

如何有效地搜索此层次结构?

我有一个如下所示的数据结构: public class Node { public string Code { get; set; } public string Description { get; set; } … public List Children { get; set; } } 在给定指定的Code ,我想编写一个返回特定节点的方法。 通常我会在层次结构中进行递归遍历以找到节点,但我关注性能。 层次结构中将有数千个节点,并且此方法将被多次调用。 如何构建它以使其更快? 我是否可以使用现有的数据结构,可能在保留层次结构的同时对Code执行二进制搜索,而不是自己重新实现某种forms的二进制搜索?

直接返回值或创建临时变量之间的性能差异

与直接返回分配给此变量的值相比,在函数中创建临时变量是否存在任何性能损失或内存消耗差异? 例如,这些函数中的哪一个(GetValue)性能更好,节省内存或两者都完全相同: 情况1: private string GetValue() { return this.GetResult(); } private string GetResult() { // Code here that return a big string… } 案例2: private string GetValue() { string result = this.GetResult(); return result; } private string GetResult() { // Code here that return a big string… } 谢谢。

.NET x64中的for循环性能奇怪:偶数迭代亲和力?

运行一个包含大量迭代的空for循环,我在运行所需的时间内得到了截然不同的数字: public static class Program { static void Main() { var sw = new Stopwatch(); sw.Start(); for (var i = 0; i < 1000000000; ++i) { } sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds); } } 以上将在我的机器上运行大约200ms,但如果我将它增加到1000000001,那么它需要4倍的时间! 然后,如果我把它设为1000000002,那么它再次下降到200ms! 这似乎发生在偶数次迭代中。 如果我去for (var i = 1; i < 1000000001 ,(注意从1开始而不是0)那么它是200ms。或者如果我做i <= 1000000001 (注意小于或等于 )那么它是200ms。或者(var i = 0; i < 2000000000; i += […]

初始化集合时,hashset对内存有什么作用?

我偶然发现了以下问题。 我想要一个所有数字从1到100.000.000的哈希集。 我尝试了以下代码: var mySet = new HashSet(); for (var k = 1; k <= 100000000; k++) mySet.Add(k); 那个代码没有成功,因为我在49mil附近的内存溢出。 这也很慢,内存增长过度。 然后我尝试了这个。 var mySet = Enumerable.Range(1, 100000000).ToHashSet(); 其中ToHashSet()是以下代码: public static HashSet ToHashSet(this IEnumerable source) { return new HashSet(source); } 我再次获得了内存溢出,但是我能够使用之前的代码输入更多数字。 有效的方法如下: var tempList = new List(); for (var k = 1; k <= 100000000; k++) tempList.Add(k); […]

.NET装箱/拆箱与铸造性能

我试图从性能的角度理解两种解决方案中哪一种更受欢迎。 例如,我有两段代码: 1)拳击/拆箱 int val = 5; Session[“key”] = val; int val2 = (int)Session[“key”]; 2)Casting(IntObj有int属性来存储int) IntObj val = new IntObj(5); Session[“key”] = val; int val2 = ((IntObj )Session[“key”]).Value; 这些例子之间的内存管理差异是什么? 有没有更快的方法来执行此类操作? 注意: Session只是例如,它可以是任何Dictionary

是否有LINQ扩展或(一组合理/有效的LINQ扩展)确定集合是否至少具有’x’元素?

我有代码需要知道集合不应该为空或只包含一个项目。 一般来说,我想要一个表单的扩展: bool collectionHasAtLeast2Items = collection.AtLeast(2); 我可以轻松地编写扩展,枚举集合并递增索引器,直到我达到所请求的大小,或者耗尽元素,但是LINQ框架中是否已经存在这样做? 我的想法(按照我发现的顺序)是:: bool collectionHasAtLeast2Items = collection.Take(2).Count() == 2; 要么 bool collectionHasAtLeast2Items = collection.Take(2).ToList().Count == 2; 虽然采用了比集合包含更多元素的行为没有定义(在文档中) Enumerable.Take方法 ,但它似乎做了人们所期望的。 它不是最有效的解决方案,要么枚举一次取元素,再枚举再次计算它们,这是不必要的,或者枚举一次取元素,然后构造一个列表以获得不是枚举器的count属性-y,因为我实际上不想要列表。 它并不漂亮,因为我总是要做两个断言,首先取’x’,然后检查我实际收到’x’,这取决于无证件的行为。 或许我可以使用: bool collectionHasAtLeast2Items = collection.ElementAtOrDefault(2) != null; 但是,这在语义上并不明确。 也许最好的方法是使用方法名称来包装它,这意味着我想要的东西。 我假设这将是有效的,我没有反映在代码上。 其他一些想法正在使用Last() ,但我明确地不想枚举整个集合。 或者Skip(2).Any() ,再次在语义上并不完全明显,但优于ElementAtOrDefault(2) != null ,虽然我认为它们会产生相同的结果? 有什么想法吗?

C#Winforms:高效显示多个控件

我正在构建一个包含15×15 = 225个按钮的控件,需要resize。 因为它是一个网格,锚定和对接将不起作用。 我已经尝试了TableLayoutPanel以及处理resize事件来手动放置和调整控件。 在这两种情况下,resize都是慢得令人无法接受的。 当我手动处理布局时,在resizefunction中暂停/恢复布局没有帮助。 有什么基本的东西我可以改变以加快速度,或者这仅仅是本机控制的限制? 我知道我可以从头开始构建一个自定义控件,处理点击并自己绘画 – 尽管如果可能的话我宁愿坚持使用原生控件。 编辑 我知道它有很多按钮。 我的问题是技术问题; 不是关于UI设计的。

这种.Net(C#)属性的使用是否昂贵?

我想知道.Net中属性的使用,特别是C#是否昂贵,为什么或为什么不呢? 我特别询问C#,除非不同的.Net语言之间没有区别(因为基类库是相同的?)。 所有较新的.Net技术都广泛使用属性,例如Linq to SQL,ASP.Net MVC,WCF,企业库等,我想知道这会对性能产生什么影响。 很多类都会使用某些属性自动修饰,或者某些function/特性需要这些属性。 费用问题是否取决于具体实施细节? 如何将属性编译为IL? 它们是自动缓存还是由实现者决定?

通过增加索引总和来生成排序的有效方法

对于启发式算法,我需要一个接一个地评估某个集合的组合,直到达到停止标准。 由于它们很多,目前我使用以下内存高效迭代器块生成它们(受python的itertools.combinations启发): public static IEnumerable GetCombinations(this IList pool, int r) { int n = pool.Count; if (r > n) throw new ArgumentException(“r cannot be greater than pool size”); int[] indices = Enumerable.Range(0, r).ToArray(); yield return indices.Select(idx => pool[idx]).ToArray(); while (true) { int i; for (i = r – 1; i >= 0; i–) if (indices[i] […]