Tag: 性能

整数与双算术性能?

我正在编写一个C#类来使用整数执行2D可分卷积,以获得比双对应更好的性能。 问题是我没有获得真正的性能提升。 这是Xfilter代码(对于int和double两种情况都有效): foreach (pixel) { int value = 0; for (int k = 0; k < filterOffsetsX.Length; k++) { value += InputImage[index + filterOffsetsX[k]] * filterValuesX[k]; //index is relative to current pixel position } tempImage[index] = value; } 在整数情况“value”中,“InputImage”和“tempImage”是“int”,“Image ”和“Image ”类型。 在双重“value”中,“InputImage”和“tempImage”是“double”,“Image ”和“Image ”类型。 (filterValues在每种情况下都是int []) (Image 类是extern dll的一部分。它应该类似于.NET Drawing Image类..)。 我的目标是通过int + =(byte […]

为什么C#Array.BinarySearch如此之快?

我在C#中实现了一个非常简单的 binarySearch实现,用于在整数数组中查找整数: 二进制搜索 static int binarySearch(int[] arr, int i) { int low = 0, high = arr.Length – 1, mid; while (low <= high) { mid = (low + high) / 2; if (i arr[mid]) low = mid + 1; else return mid; } return -1; } 将它与C#的原生Array.BinarySearch()进行比较时,我发现Array.BinarySearch() 速度是我的函数的两倍多 。 Array.BinarySearch上的 MSDN: 使用由Array的每个元素和指定对象实现的IComparable通用接口,搜索特定元素的整个一维排序数组。 是什么让这种方法如此之快? 测试代码 […]

Enum.Parse()或Switch

要将字符串转换为枚举,以下哪种方式更好? 这段代码: colorEnum color = (colorEnum)Enum.Parse(typeof(colorEnum), “Green”); 或这个: string colorString = … colorEnum color; switch (colorString) { case “Green”: color = colorEnum.Green; break; case “Red”: color = colorEnum.Red; break; case “Orange”: color = colorEnum.Orange; break; …. }

批量化长Linq操作?

我问了一个问题,并在这里得到了关于性能问题的答案,我收集了大量数据。 (用linq创建) 好吧,让我们把它放在一边。 但Marc建议的一个有趣(和天才 )优化是Batchify化linq查询。 /*1*/ static IEnumerable Batchify(this IEnumerable source, int count) /*2*/ { /*3*/ var list = new List(count); /*4*/ foreach(var item in source) /*5*/ { /*6*/ list.Add(item); /*7*/ if(list.Count == count) /*8*/ { /*9*/ foreach (var x in list) yield return x; /*10*/ list.Clear(); /*11*/ } /*12*/ } /*13*/ foreach (var item […]

readonly是否有任何运行时开销?

出于某种原因,我一直认为readonly字段有与它们相关的开销,我认为这是CLR跟踪是否已初始化readonly字段。 这里的开销是一些额外的内存使用量来跟踪状态并在分配值时进行检查。 也许我假设这是因为我不知道readonly字段只能在构造函数内或字段声明本身内初始化,并且没有运行时检查,你将无法保证它不被多次分配各种方法。 但是现在我知道了,它可以很容易地被C#编译器静态检查,对吧? 那是这样的吗? 另一个原因是我读过readonly的使用对性能有轻微的影响,但他们从未涉及过这个主张,因此无法找到有关此主题的信息,因此我提出了问题。 我不知道运行时检查可能会对其他性能产生什么影响。 第三个原因是我看到readonly在编译的IL中保存为initonly ,所以如果readonly仅仅是C#编译器保证该字段永远不会分配给IL,那么这个信息在IL中的原因是什么?在构造函数或声明之外? 另一方面,我发现你可以通过reflection设置readonly int的值,而CLR不会抛出exception,如果readonly是运行时检查,这是不可能的。 所以我的猜测是:’readonlyness’只是一个编译时function,任何人都可以确认/否认这个吗? 如果是,那么这些信息被包含在IL中的原因是什么?

如果在第一次“返回”之后有一个“else”,那么性能是否重要?

我现在已经看到了两种不同的方法来制作布尔返回方法: bool Case1() { if (A) return true; else return false; } bool Case2() { if (A) return true; return false; } 哪一个更快? 为了节省一条线路,使其更清晰,或者是否可以忽略不计的性能增益,是否有理由不写else ?

将IQueryable linq查询转换为IEnumerable 取消linq优化的工作方式?

我在.NET上有点新手,我想知道linq是如何工作的,因为你可以一个接一个地使用许多linq查询,但是在它们用于传输信息或转换为列表之前,它们都没有真正执行,等等 有两种重要的方法来获取linq查询,使用IQueryable ,它直接在Sql上使用wherefilter,IEnumerable获取所有记录,然后在内存中使用它们。 但是,让我们来看看这段代码: //Linq dynamic library IQueryable myResult = db.Categories .Where(a => a.Name.Contains(StringName)) .OrderBy(“Name”) .Skip(0) .Take(10); if (myResult != null) { return myResult.AsEnumerable(); } else { return null; } 我正在使用Linq动态库,这个查询的直接结果是获取IQueryable ,如果查询最终被返回为IEnumerable ,是否真的在sql上过滤了查询? 还是在记忆中?

C#数组还是字典?

我想知道C#数组是否具有恒定的访问速度? 我需要在静态数组中存储1000个项目,这些项目将在服务器启动期间初始化。 此数组将以只读方式使用,因此不会对数组进行任何更改。 我应该使用简单的C#数组(新的MyClass [])或字典。 我是C#的新手,并试图了解C#数组访问是如何工作的。 它们可以通过速度与c ++数组进行比较吗?

遍历树时使用线程

我想加快穿越树的过程。 以下是节点的示例: class Node { public List Children { get; set; } public int SompeProperty { get; set; } public String SomeOtherProperty { get; set; } } 我遍历尝试的方式如下: static void TraverseTree(Node ParentNode) { if (ParentNode.Children == null) return; foreach (var child in ParentNode.Children) { TraverseTree(child); } } ParentNode.Children方法大约需要1毫秒,因为Node表示文件或目录。 我只是用这个节点的例子来说明我的观点。 所以如果你考虑一下,如果第一个节点有4个子节点,并且每个子节点都有10000000个后代,那么如果我们在一个separeate线程中利用并行编程来遍历这4个子节点中的每一个,我们就可以提高这种遍历的速度。 如果那就是情景那么我会采取这种方法。 但如果我事先不知道树的结构我怎么能这样做呢? 我一直在考虑: 1)开始遍历树,将具有子节点的前10个节点放在堆栈上,然后在单独的线程上开始遍历每个节点。 2)做类似的事情: […]

C#中代理的意外性能不佳

我之前发布了关于在C#中动态编​​译代码的问题 ,答案又引出了另一个问题。 一个建议是我使用代表,我尝试过并且它们运行良好。 然而,它们比直接呼叫慢大约8.4 X,这没有任何意义。 这段代码有什么问题? 我的结果,.Net 4.0,64位,直接运行exe:62,514,530 public static int Execute(int i) { return i * 2; } private void button30_Click(object sender, EventArgs e) { CSharpCodeProvider foo = new CSharpCodeProvider(); var res = foo.CompileAssemblyFromSource( new System.CodeDom.Compiler.CompilerParameters() { GenerateInMemory = true, CompilerOptions = @”/optimize”, }, @”public class FooClass { public static int Execute(int i) { […]