for循环的优化

2024-03-29

我正在编写一些 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 中的值将永远变化,无法配对匹配。


你应该删除这个:

int length = CAArray.Length;

并将循环替换为:

for (int i= 0; i < CAArray.Length; i++)
{
    Value += CAArray[i].ClassB.Value * CAArray[i].Multiplier;
} 

像原始代码一样存储长度慢下来C# 代码(我知道这违反直觉)。这是因为,如果直接在 for 循环中使用 Array.Length,则抖动将跳过在循环的每次迭代中执行数组边界检查。

另外,我强烈建议并行此过程。最简单的方法是

CAArray.AsParallel().Sum(i => i.ClassB.Value * i.Multiplier);

虽然你可以潜在地无需 LINQ 即可获得更快的速度(尽管您随后需要担心管理多个线程的低级细节)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

for循环的优化 的相关文章

随机推荐

  • 子类化 static.File

    我是 Twisted 的新手 在对twisted 中的 static File 进行一些必要的子类化时遇到了麻烦 我正在尝试在子类中设置请求标头 class ResponseFile static File def render GET s
  • now-cli 部署不会构建 package.json 依赖项

    我正在尝试通过部署 Sapper 构建的应用程序 now node 该任务基本上是部署具有依赖项的 Polka 服务器并静态地提供静态 和客户端 文件 我已设法通过 includeFiles 包含 Lambda 所需的文件 但现在我在日志中
  • IIS 7如何保留网站子文件夹身份验证设置

    在 IIS 中 您可以使用 功能 视图来设置文件夹级别的设置 请参见屏幕截图 我想对网站的多个子文件夹禁用匿名身份验证 并将这些设置保存到源代码管理中 我想知道 IIS 将这些设置保存在哪里 它们不在网站 web config 或子文件夹内
  • Hibernate为MySQL生成同名索引和外键

    因此 在 Hibernate 管理的一个类中 我有以下属性定义 ManyToOne optional false private Company company 当为 MySQL 创建数据库模式时 Hibernate 会自动为此字段创建外键
  • 等到作用域变量加载完毕后,再在 angular.js 的视图中使用它

    我见过this https stackoverflow com a 11972028 110233 and this https stackoverflow com questions 12265565 angularjs promise
  • 盈透证券 API:交易者工作站 (TWS) 与 IB 网关

    In 据记载 为了使用 IB api 您必须通过 TWS 或 IB 网关连接到它 我们的 API 需要通过交易者工作站 TWS 或 IB 网关进行连接 各自的优势是什么 哪种解决方案 网关或 TWS 可提供更好的性能 网关缺少 TWS 的
  • 如何在类中创建模板函数? (C++)

    我知道可以制作一个模板函数 template
  • C# 的磁盘支持字典/缓存

    我正在寻找一种用于缓存大量数据的解决方案 相关问题但针对不同语言 Python 基于磁盘的字典 https stackoverflow com questions 226693 python disk based dictionary 磁盘
  • Backbone.js 和 Rails - 如何处理来自 Backbone 模型的参数?

    在标准 Rails 控制器中 我将创建如下记录 user User new params user 这假设传入的表单参数是嵌套的 我一直在使用 Backbone js 我注意到默认情况下 Backbone 不会像普通 Rails 表单那样嵌
  • UICollectionView 委托方法 cellForItemAtIndexPath:indexPath 未从 sizeForItemAtIndexPath 调用

    当我打电话时 collectionView cellForItemAtIndexPath indexPath 从内部 collectionView layout sizeForItemAtIndexPath 那么委托方法不会被触发 知道为什
  • 从另一个项目将外部资源添加到gradle中的jar中

    我有一个项目 有一个 资源 库 不是基于java的 它仅包含多个 java 项目使用的文件层次结构 library files binaries etc 在我的一个java项目中 我想将这些文件包含在组装的jar文件中 current de
  • LOH 碎片 - 2015 年更新

    有大量有关 NET LOH 的信息 并且已在各种文章中进行了解释 不过 有些文章似乎缺乏一点精确性 过时的信息 In Brian Rasmussen 的回答 2009 Microsoft 项目经理 https stackoverflow c
  • 如何增加 swift int 枚举

    我有一个快速枚举 enum MainState Int case NotStarted case Init case AskWhatToText case RecordWhatToText var state MainState NotSt
  • ActiveRecord查询别名字段名输出

    假设我有一张桌子World 我有一个名为foo表内 我想查询的是World表并选择foo 但我想将其别名为bar在后续转换为 JSON 输出时 有什么方法可以为这一 ActiveRecord 查询设置字段名称的别名吗 不希望在整个应用程序中
  • 从文本文件中读取矩阵并将其存储在二维数组中

    我一直在尝试将矩阵输入存储在数组中的文本文件中 但它显示了特殊的输出 这是代码 include
  • WinRT 组件能否在 Windows 7 中工作[重复]

    这个问题在这里已经有答案了 我读到Windows有来自Windows 8的新API 它被称为WinRT 我打算使用它 但我担心Windows 7 My Goal 我计划构建一种新的编程语言并使用它 但为了使其可用 它必须具有 Gui 编程
  • 学说:两个数据库中两个实体之间的关系

    我正在使用 MySQL 和 Doctrine 2 与 Symfony 3 我想在两个独立数据库中的两个实体之间建立多对多关系 我认为 Doctrine 无法处理这个问题 至少不能以原生方式处理 无论如何 为了执行此操作 我正在使用schem
  • 使用模板:首先解决运算符还是首先解决转换?

    我昨天看到了一些有趣的编译器行为 我想我明白为什么会发生这种情况 但我想确定一下 所以 我不会写我的推理 只写事实 请注意 这不是我包含的拼写错误vector代替string 我是故意这样做的 这样编译器就无法理解 std string 是
  • 如何使用计时器对图像应用淡入淡出过渡效果?

    我正在尝试在两个 PictureBox 控件之间进行淡入淡出过渡 我使用计时器来更改两个 PictureBox 的不透明度GetPixel and SetPixel每当时间流逝 在这个阶段 问题是这段代码引发了异常 System Inval
  • for循环的优化

    我正在编写一些 C 代码 目前应该尽可能快地运行 通常以 100 的速度占用单个核心约 25 分钟 我需要代码保持单核 因为跨多个核运行此代码的好处不会像同时多次运行此项目那样大 有问题的代码如下 public Double UpdateS