【问题标题】:Optimize nested loops c#优化嵌套循环c#
【发布时间】:2015-05-29 11:59:51
【问题描述】:

我正在尝试优化以下代码和平 - 有多次迭代会消耗大量时间。查看 Parallel.For 示例,但不明白如何在我的情况下使用它们,因为我在每个“for”循环中都有“double”变量。你能帮忙吗?谢谢

public void maximization ()
    {
        int ii = 0; // counter to alter file name
        int jj = 0; // counter for all output strings

        string[] calculation;

        ArrayList array = new ArrayList(); // temporary array for optimized parameters

        for (pr_lower1 = -0.02; pr_lower1 <= 0.0; pr_lower1 = pr_lower1 + 0.002) //11
        {
            for (pr_upper1 = 0.002; pr_upper1 <= 0.02; pr_upper1 = pr_upper1 + 0.002) //10
            {
                for (OI_lower1 = 0.02; OI_lower1 <= 0.1; OI_lower1 = OI_lower1 + 0.01) //9
                {
                    for (pr_lower2 = -0.02; pr_lower2 <= 0.0; pr_lower2 = pr_lower2 + 0.002) //11
                    {
                        for (pr_upper2 = 0.002; pr_upper2 <= 0.02; pr_upper2 = pr_upper2 + 0.002) //10
                        {
                            for (OI_lower2 = -0.1; OI_lower2 <= 0.0; OI_lower2 = OI_lower2 + 0.01) //11
                            {
                                for (OI_upper2 = 0.01; OI_upper2 <= 0.1; OI_upper2 = OI_upper2 + 0.01) //10
                                {
                                    for (stop = 0.05; stop <= 0.27; stop = stop + 0.02) //12
                                    {
                                        for (tp = 0.05; tp <= 0.27; tp = tp + 0.02) //12
                                        {                                                
                                            this.run_algo_max();
                                            jj++;
                                            string output = ret + " " + jj;
                                            array.Add(output);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            ii++;
            calculation = (String[])array.ToArray(typeof(string));
            array.Clear();
            File.WriteAllLines(Application.StartupPath + "\\results" + ii + ".txt", calculation);
        }
    }

【问题讨论】:

  • 你确定你真的需要这么多的循环吗?
  • 不幸的是。我有几个参数要优化并试图找到最佳组合
  • 这个例子有很多错误。首先,当您计划并行化任何东西时,不要使用类属性。将所有参数传递给run_algo_max 方法,并将返回值作为常规返回值返回。否则,并行化将导致竞争条件。第二:与其直接调用run_algo_max,不如让它成为一个可以迭代选择要检查的特性的委托。 (待定下一条评论)
  • 如果你能给出真正的代码……现在我可以通过删除 allloops 来为你优化这个;)
  • 第三,使用启发式。不要计算整个 170 万个特征空间。样本稀疏,立即评估特征点的质量,并将新的要检查的点推回到要检查的点队列中。仔细检查哪些参数推导较低,并首先使其更粗略。仅在这些上增加采样率,因为您已固定具有更高推导的参数。哦,为什么是代表?因此,您可以将新 ponts 排队的代码和负责并行(或卸载)执行的代码分开。

标签: c# loops optimization nested parallel.for


【解决方案1】:

要实现并行化,您必须重写 run_algo_max 方法,以便将值作为参数并返回结果。

在这种情况下,您可以发送两个参数并计算相应的值。 (156816000 是除第一个之外的所有循环长度的乘积。)您可以将结果直接写入文件,这样您就不需要在内存中保留数百万个字符串:

for (int ii = 0; ii < 11; ii++) {
  int jj = ii * 156816000;
  File.WriteAllLines(
    Application.StartupPath + "\\results" + ii + ".txt",

    Enumerable.Range(0, 156816000)
    .AsParallel()
    .Select(n => this.run_algo_max(ii, n) + " " + (jj + n))
  );
}

该方法将获取参数、计算值、执行工作并返回结果:

public string run_algo_max(int ii, int n) {
  double pr_lower1 = -0.02 + ii * 0.002;
  double pr_upper1 = 0.002 + (n % 10) * 0.002; n /= 10;
  double OI_lower1 = 0.02 + (n % 9) * 0.01; n /= 9;
  // etc.
  double stop = 0.05 + (n % 12) * 0.02; n /= 12;
  double tp = 0.05 + n * 0.02;
  // do the work, produce a string "result"
  return result;
}

【讨论】:

  • @Ext3h:代码根本没有分配任何数组。 Select 的结果是一个 IEnumerable&lt;string&gt;,它在生成值时写入文件,因为它是 File.WriteAllLines 方法使用可枚举的。
  • 谢谢你们的帮助,伙计们!在代码的第一部分中,您在哪里声明变量“n”?请问它是如何工作的?
  • @RushanVakhitov:n 变量是 lambda 表达式中的参数。 lambda 表达式创建一个与string F(int n){ return this.run_algo_max(ii, n) + " " + (jj + n); } 等效的函数的委托。 Select 方法为Enumerable.Range 方法生成的每个值运行此函数。
  • 感觉自己很愚蠢,但我不明白代码的第二部分是如何工作的。在调试期间尝试“观察”Locals 窗口中“n”的值 - 没有帮助。 “n”取“随机”值-调试从一行代码跳转到另一行..你能解释一下吗?非常感谢!
  • @RushanVakhitov:考虑一个包含{{ 0,1,2 }, { 3,4,5 }, { 6,7,8}} 的二维 3x3 数组。根据项目中的数字,您可以计算出xn % 3yn / 3。这是相同的,但在八个维度(10x9x11x10x11x10x12x12),并且索引是双倍的。
猜你喜欢
  • 1970-01-01
  • 2013-05-30
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 2012-01-27
相关资源
最近更新 更多