none
plinq如何对where进行加速? RRS feed

  • 问题

  • 一个查询,大概是这样:

    IEnumerable<mytype> q = from mytype entry in myCollections
    
        where conditionFunc1(entry)
    
         && conditionFunc2(entry)
    
         && conditionFunc3(entry)
    
        select entry;
    
    
    现在发现如果仅仅把myCollections改成myCollections.AsParallel(),不快反慢,原因是这种只能对select加速,而查询的主要开销在conditionFunc1 conditionFunc2 conditionFunc3 上

    那么有没有方法对where加速呢?
    2010年6月3日 13:34

答案

全部回复

  • Where是可以使用PLINQ加速的,您的条件中或者myCollections是不是有什么阻止并行查询的东西比如lock块?
    Tech Blog: http://gildor.cnblogs.com
    2010年6月9日 8:43
  • 没有lock啊,都是简单的、只读的查找、判断

    您确定plinq可以对where加速?哪个文献里说的?我看到的都是对select这个运算符加速

    2010年6月9日 14:37
  • 2010年6月9日 18:23
  •  看来要显式指定每个运算符都是parallel版本,先记录一下,试过再议,非常感谢:

     

    In addition to the call to AsParallel, you must also reference the ParallelEnumerable type. For example, imagine the above query was written by calling Enumerable directly:

    IEnumerable<T> data = ...;
    var q = Enumerable.Select(
          Enumerable.OrderBy(
            Enumerable.Where(data, (x) => p(x)),
          (x) => k(x)),
        (x) => f(x));
    foreach (var e in q) a(e);
    
    To use PLINQ, the query would have to be rewritten like this:
    IEnumerable<T> data = ...;
    var q = ParallelEnumerable.Select(
          ParallelEnumerable.OrderBy(
            ParallelEnumerable.Where(data.AsParallel(), (x) =>  p(x)),
          (x) => k(x)),
        (x) => f(x));
    foreach (var e in q) a(e);
    
    2010年6月10日 4:28