随笔 - 290  文章 - 10  评论 - 85  2

对内存中的数据做并行运算,

AsParallel(并行化)

就是在集合后加个AsParallel()

性能比较: 并行用了27秒,不用并行用了33秒

                var Elements = EleList.Where(m =>
                                                        {
                                                            foreach (var rule in tmpRules)
                                                            {
                                                                rule.Status = false;
                                                                if (!rule.Match(m))
                                                                {
                                                                    break;
                                                                }
                                                            }
                                                            return tmpRules.Where(r => r.Status == false).Count() == 0;
                                                        }).AsParallel().ToList();

 使用QueueUserWorkItem,速度又有所提升,大概10秒左右 

                var doneEvent = new ManualResetEvent(false);
                int taskCount = 0;

                for (int i = 0; i < filteredEleList.Count; i++)
                {
                    int index = i;
                    Interlocked.Increment(ref taskCount);
                    matchTmpRules[index] = tmpRules;

                    ThreadPool.QueueUserWorkItem((object evt) =>
                    {
                        try
                        {
                            var field = filteredEleList[index];
                            
                            foreach (var rule in matchTmpRules[index])
                            {
                                rule.Status = false;
                                if (!rule.Match(field))
                                {
                                    break;
                                }
                            }

                            if(tmpRules.Where(r => r.Status == false).Count() == 0)
                            {
                                tmpElements.Add(field);
                            }

                        }
                        catch (Exception ex)
                        {
                            //Logger.Write(ex, "There was an error while trying to match field '" + fields[index].Name + "'.");
                        }
                        finally
                        {
                            if (Interlocked.Decrement(ref taskCount) == 0)
                            {
                                doneEvent.Set();
                            }
                        }
                    }, null);

                }
                doneEvent.WaitOne();

  

 

posted on 2019-02-14 00:55  Gu  阅读(...)  评论(...编辑  收藏