【发布时间】:2012-12-16 10:46:52
【问题描述】:
我需要统计两个大字符串数组的交集对应的元素个数,而且速度非常快。
我正在使用以下代码:
arr1[i].Intersect(arr2[j]).Count()
对于 CPU Time,VS Profiler 表示
- 85.1% 在
System.Linq.Enumerable.Count() - 0.3% 在
System.Linq.Enumerable.Intersect()
不幸的是,完成所有工作可能需要几个小时。
如何更快?
【问题讨论】:
-
您从分析器获得的数字可能不是“正确的”。因为当你说 .Intersect() 时不会执行 Intersect,所以当你说 .Count() 时会执行整个查询。这就是 LINQ 的本质。我怀疑相交时要做的工作比计数时要多。如果你真的需要这方面的性能,请尝试不使用 LINQ。
-
如果足够大,把它放到数据库中,或者创建一个计算机/线程集群,也许做一些 MapReduce..
-
您是在与
arr1和arr2中的字符串或arr1中每个字符串中的每个字符相交,还是与arr2中每个字符串中的每个字符相交? -
我几乎不认为这是你的瓶颈。在我的测试中,对 2 个包含 500 万个字符串(avg.length=60 字符)的数组进行交叉 + 计数需要约 3.5 秒...您的数组有多大?
标签: c# optimization array-intersect