Parallel For循环是否支持非1步长迭代?自定义步长实现效率如何?
首先明确:你现在这种靠i%25 == 0过滤的写法确实存在不必要的效率损耗。
原因很简单:原本你的逻辑只需要执行20次(500/25=20),但这种写法会让并行框架生成500次迭代任务,哪怕480次迭代都是直接跳过,也会产生额外的任务调度、资源分配开销。如果你的业务逻辑本身比较轻量,这部分额外开销的占比会非常突出,完全没有必要。
正确的转换方案
推荐两种无额外开销的写法:
方案1:对目标索引序列做并行遍历
先直接生成所有符合步长要求的索引值,再用Parallel.ForEach执行:
// 生成序列:0、25、50……475 var validIndexes = Enumerable.Range(0, 20).Select(num => num * 25); Parallel.ForEach(validIndexes, i => { // 直接执行业务逻辑,无需额外判断 });
方案2:并行迭代映射为实际索引
如果习惯用Parallel.For,可以把迭代次数设置为实际需要的20次,内部手动映射为步长25的索引:
Parallel.For(0, 20, k => { int i = k * 25; // 直接执行业务逻辑 });
如果你的业务逻辑本身执行耗时极长,原本的过滤写法的开销确实可以被忽略,但依然不推荐,毕竟多了一层判断逻辑,可读性也更差。
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

