Tag: 优化

不同优化的不可解释的时间安排

我正在编写一些代码,必须根据设置将不同的算法应用于大型数据集。 数据集很大,现实世界的时间表明我们需要尽可能地优化它。 所选算法必须在来自大型arrays的许多数据子集上运行。 因此,我决定尝试几种不同的方法: 初始化Func委托以引用所需的算法。 从主循环中调用此委托。 循环数据并从主循环内调用适当的算法。 调用一个单独的方法,为每个算法实现主循环。 在我的测试中,我让每种方法都调用相同的底层方法calculate() 。 (当然,真实代码为每个算法调用不同的方法,但在这里我测试调用算法的最快方法,而不是算法本身。) 每个测试都在ITERS循环中调用所需的算法。 在此测试代码中, DataReductionAlgorithm只是一个定义各种算法的枚举。 除了模拟实际代码中会发生什么之外,它并不是真正使用的。 这是我的方法(1)的测试实现。 它非常简单:将Func a分配给要调用的算法,然后从循环中调用它: private static void test1(int[] data, DataReductionAlgorithm algorithm) { Func a; switch (algorithm) { case DataReductionAlgorithm.Max: a = calculate; break; case DataReductionAlgorithm.Mean: a = calculate; break; default: a = calculate; break; } for (int i = 0; i […]

最有效的IEnumerable工作方式

在C#中遍历集合/ IEnumeration的最有效方法是什么。 我有一个包含近1100个对象的列表。 这些对象中的大约10个,包含1000个子对象(相同类型)。 遍历此列表需要大约5-6秒。 这是我的代码: foreach (Parameter par in this.AllParameters) //this.AllParameters is Generic.List type { foreach (Parameter subPar in par.WrappedSubParameters) { subPar.IsSelected = false; } par.IsSelected = false; } 有没有办法优化这段代码,以便它足够快,不需要5-6秒?

for循环的优化

嗨,大家好我正在写一些目前应该尽可能快地运行的c#代码,通常占用100%的单个核心大约25分钟。 我需要代码保持单核心,因为跨多个核心运行此代码的好处不会像同时多次运行此项目一样好 有问题的代码如下 public Double UpdateStuff(){ ClassA[] CAArray = ClassA[*a very large number indeed*]; Double Value = 0; int length = CAArray.Length; for (int i= 0; i< length ; i++) { Value += CAArray[i].ClassB.Value * CAArray[i].Multiplier; } return Value; } 根据分析器,代码的这个区域负责应用程序的78%的负载,因此似乎是优化的良好候选者。 !!!注意:该函数已从返回类型void更改为返回类型Double,这是伪代码而不是实际代码,以便于阅读 澄清:.net,c#4.0,visual studio 2010,目标机器:windows server 2008 x64 编辑:进一步澄清:此上下文中的所有变量都是公共的而不是属性。 CAArray [i] .ClassB.Value中的值将永远改变不能匹配的双精度数。

寻找完美的数字(优化)

我用C#编写了一个程序,以便在一定范围内找到完美的数字,作为编程挑战的一部分。 但是,我意识到计算10000以上的完美数字时速度非常慢。有没有找到完美数字的优化方法? 我的代码如下: using System; using System.Collections.Generic; using System.Linq; namespace ConsoleTest { class Program { public static List FindDivisors(int inputNo) { List Divisors = new List(); for (int i = 1; i<inputNo; i++) { if (inputNo%i==0) Divisors.Add(i); } return Divisors; } public static void Main(string[] args) { const int limit = 100000; List PerfectNumbers = […]

我可以阻止CLR优化掉调试信息吗?

我为unit testing编写了一个抽象基类,为我们的测试运行设置了足够的环境。 该类将一些运行时环境位公开为属性,其类型因test而异(属性类型是inheritance的具体测试类中指定的类型参数)。 这一切都很好,除了一位同事发现他无法在调试器中查看任何类的属性。 原因是他没有在他的inheritance类中定义字段,并且CLR优化了某些东西,所以调试器无法显示属性。 是否有可能以某种方式在基类中防止这种情况,或者我是否必须告诉每个人他们需要定义至少一个在测试期间某处使用的字段? 编辑: 听起来像一个可能的罪魁祸首应该是优化/调试设置。 也就是说,我正在调试模式下从Visual Studio构建应用程序,我已经仔细检查了所有项目都是为调试版本设置的,并且此解决方案中的所有项目都没有设置Optimize标志。 也许有必要注意我正在使用MSTest和Visual Studio测试运行器。 编辑2: 通过“无法查看属性”我指的是当我在Quickwatch中评估属性并获得红色感叹号和文本“无法评估表达式”错误文本时。 并且为了避免你认为我完全偏离我的怀疑,添加一个在测试初始化​​方法中初始化的实例字段会使问题消失…… 编辑3: 检查构建输出。 我注意到使用以下选项调用编译器: /debug+ /debug:full /optimize- /define:DEBUG,TRACE 我认为这足以阻止这种情况发生,但是你去了。 🙂

在C#中,引用数组变量是否较慢?

我有一个整数数组,我正在循环它们: for (int i = 0; i < data.Length; i++) { // do a lot of stuff here using data[i] } 如果我做: for (int i = 0; i < data.Length; i++) { int value = data[i]; // do a lot of stuff with value instead of data[i] } 是否有任何表现收益/损失? 根据我的理解,直接访问C / C ++数组元素,即整数的n元素数组具有长度为n * sizeof(int)的连续内存块,而程序访问元素i通过执行类似* […]

未使用的使用语句

我可能已经知道这个问题的答案,但我认为无论如何都值得问。 如果我在我的代码文件中加载了一些未using语句; 这会对性能产生任何不利影响吗? 编译器如何在编译/运行时处理它们? 谢谢

复制C#多维数组元素的最有效方法是什么?

在C#中从一个多维数组复制到另一个多维数组时,嵌套循环的最有效方法是什么? 每个数组的上限和下限都不同,所以我不认为 Array.Copy()会为我做这个工作。 我目前有以下内容: for (int x = lower.X; x <= upper.X; x++) { for (int y = lower.Y; y <= upper.Y; y++) { for (int z = lower.Z; z <= upper.Z; z++) { copy[x, y, z] = Elements[x, y, z]; } } } 这是一个相对较低级别的优化,编译器会为我处理这个问题吗? 当目标具有不同的上限和下限时,是否有更好的方法来复制多维数组的元素?

许多方法杀死代码速度?

我正在构建一个比它应该慢得多的应用程序(一个过程需要4秒,它应该只需要0.1秒,这至少是我的目标)。 我有一堆方法将数组从一个传递到另一个。 这使我的代码保持良好和有条理,但我担心它会破坏我的代码的效率。 任何人都可以确认是否是这种情况? 另外,我的所有代码都包含在与我的UI分开的类中。 这会使得运行速度明显慢于我将我的代码包含在Form1.cs文件中吗? 编辑:需要计算大约95000个点,每个点通过7个方法进行额外的计算。

按位相等

我需要在两个字节之间执行按位相等。 这意味着,例如,如果我有两个字节:00011011和00011110,结果是11111010我看到的唯一快速方法是使用以下语句 byte a, b;//set input bytes byte c = ~(a^b);//output bytes 但我想知道是否有更快的解决方案。 在这些相等操作之后,我想掩盖我需要的位。 所以我需要使用AND操作。 所以代码变成: byte a, b;//set input bytes byte m;//mask, intresting bits are set to 1, others to 0 byte c = (~(a^b))&m;//output bytes 没有任何更快,更简单的方法,不需要使用所有这些按位操作,因为这部分代码将经常被调用。