【问题标题】:how to increase speed of my execution如何提高我的执行速度
【发布时间】:2010-04-11 05:12:39
【问题描述】:

我正在 c#.net 中创建项目。我的执行过程很慢。我还找到了原因。在一种方法中,我将值从一个列表复制到另一个列表。该列表每行包含更多 3000 个值。我怎样才能加快这个过程。任何机构帮助我

for (int i = 0; i < rectTristrip.NofStrips; i++)
            {
                VertexList verList = new VertexList();
                verList = rectTristrip.Strip[i];
                GraphicsPath rectPath4 = verList.TristripToGraphicsPath();
                for (int j = 0; j < rectPath4.PointCount; j++)
                {
                    pointList.Add(rectPath4.PathPoints[j]);
                }

            }

这是减慢我的过程的代码。矩形 tristirp 包含许多顶点,每个顶点有更多的 3000 个值..

【问题讨论】:

  • 除非你分享一些代码来展示它是如何完成的,否则这是不可能的。
  • 我有一个词要告诉你:个人资料。
  • @musicfreak 这个不用说是什么意思
  • “这件事不值得说”,你的键盘是不是少了一些键?
  • 您发布的代码 sn-p 并没有真正提供足够的上下文来了解可以优化的内容。 pointList 是如何构造的?它是什么?它有AddRange 方法吗?

标签: c# optimization list


【解决方案1】:

分析器会准确地告诉您在哪些行以及哪些对优化最重要的行上花费了多少时间。红门是一个非常好的门。

http://www.red-gate.com/products/ants_performance_profiler/index.htm

【讨论】:

  • 我同意山姆的观点。另一个非常好的分析器:jetbrains.com/profiler。您有 30 天的免费试用期
【解决方案2】:

就像 musicfreak 已经提到的那样,您应该分析您的代码以获得关于正在发生的事情的可靠结果。但有些过程只是需要一些时间。

在某种程度上你无法摆脱它们,它们必须被完成。问题只是:什么时候需要?因此,也许您可​​以将它们放入某个初始化阶段或放入另一个线程来为您计算结果,同时您的用户可以访问您的 GUI。

在我的一个应用程序中,我对 SQL Server 进行了一次大查询。这个任务需要一段时间(建立连接、发送查询、等待结果、将结果放入数据表、自己进行一些计算、将结果呈现给用户)。所有这些步骤都是必要的,不能再快了。但是当用户在结果窗口中看到带有进度条的“请稍候”时,它们将在另一个线程中完成。与此同时,用户已经可以在 UI 中进行一些其他设置(如果他喜欢的话)。所以 UI 是响应式的,用户等待几秒钟没有什么大问题。

所以这不是一个真正的答案,但也许它会给你一些关于如何解决问题的想法。

【讨论】:

    【解决方案3】:

    您可以将负载拆分为几个工作线程,例如 3 个线程,每个线程处理 1000 个元素。 可以和AutoResetEvent同步

    【讨论】:

    • 这只会导致多核系统的加速。
    • 是的,即使使用多核,在繁忙的 Web 服务器环境中也不会给您带来太多好处。 .NET 4.0 Parallel.For 的开销要少得多,而且会是更好的选择。
    • 但 .NET 4.0 仍处于测试阶段。
    【解决方案4】:

    一些建议,尽管我认为大部分工作都在 TristripToGraphicsPath() 中:

       // Use rectTristrip.Strip.Length instead of NoOfStrips
       // to let the JIT eliminate bounds checking
       // .Count if it is a list instead of array
       for (int i = 0; i < rectTristrip.Strip.Length; i++)
       {
           VertexList verList = rectTristrip.Strip[i]; // Removed 'new'
           GraphicsPath rectPath4 = verList.TristripToGraphicsPath();
    
           // Assuming pointList is infact a list, do this:
           pointList.AddRange(rectPath4.PathPoints);
           // Else do this:
    
           // Use PathPoints.Length instead of PointCount
           // to let the JIT eliminate bounds checking
           for (int j = 0; j < rectPath4.PathPoints.Length; j++)
           {
               pointList.Add(rectPath4.PathPoints[j]);
           }
       }
    

    【讨论】:

      【解决方案5】:

      也许verList = rectTristrip.Strip[i]; // 移除 'VertexList' 以节省一些内存 在循环上方定义变量 VertexList verList。

      【讨论】:

      • 除非 VertexList 是值类型,否则这不会为您节省任何内存,我对此表示怀疑。
      猜你喜欢
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多