主要代码逻辑是这2段,第一段的foreach循环求出来的result 有100w 数据,然后非常慢,请问有什么优化的吗? 这是1年的数据,业务方就是要这样查,我现在的问题就是怎么处理foreach 这段逻辑,并行计算不给用
建议采用分页思路,比如一次 foreach 处理 1000 条,然后合并结果
还可以考虑采用 Parallel.ForEach
,参考 C#并发实战Parallel.ForEach使用
上次是这样的,但是也很慢,头一个foreach 用了十几分钟 /哭
@赚1千万就收手: 电脑的CPU或内存有没有跑满?
@赚1千万就收手: 可以试试 Span
的威力
var asSpanList = CollectionsMarshal.AsSpan(result);
for (var i = 0; i < asSpanList.Length; i++)
{
var item = asSpanList[i];
}
@赚1千万就收手: 还可以考虑使用 ref
+ Span
var asSpanList = CollectionsMarshal.AsSpan(result);
ref BillPaymentStatisticsResponse ptr = ref MemoryMarshal.GetReference(asSpanList);
for (var i = 0; i < asSpanList.Length; i++)
{
var item = Unsafe.Add(ref ptr, i);
}
@赚1千万就收手: 找到一篇很好的参考博文:C# Array and List Fastest Loop in 2025
@dudu: 不给用这个了,原来用过
item.sum 这种代码可以转为手动写. 每一次的.sum都要遍历一次. 累计的循环次数100w* 20 (大概数了一下), 改一下就提高20倍性能了.
sum_usd, sum_cny
for i in item
if(...) sum_usd+= i.usd
if(...) sum_cny+= i.cny
然后几个list也可以初始化的时候给好容量 response = new List<T>(result.count) 类似于.
在然后, _groupByFeeType 可以并发执行. _response = _groupByFeeType.AsParallel().Select(item=>{sum_usd, sum_cny的逻辑})
我看 foreach 20w 的数据,这里非常慢, 几分钟才 response.Add 了1w多条数据
我把这里注释了非常快
@赚1千万就收手:
慢在了 user.Where 上把, 大概? 这是到数据库查去了?
@czd890: 不是,已经从数据库查出来了
= string.Join(",", getCompanyList.Where(x => x.Id == item.BelongCompanyId).Select(x => x.NameCn));
这个慢
先降低负责度O(n)降到O(1): 类似:// Create this once when you load the data
var companyDictionary = getCompanyList.ToDictionary(x => x.Id, x => x.NameCn);
不是慢在循环上了。是慢在条件查询和聚合上了。一次查找就遍历100w,
换成字典,提前聚合,下面的直接key查找结果,性能直接就上来了。
我把这里注释了非常快
– 赚1千万就收手 2个月前