2010-06-11 2 views
3

Или решить между параллельной и последовательной операцией в целом. Трудно узнать, не проверяя, лучше ли параллельная или последовательная реализация из-за накладных расходов. Очевидно, что потребуется некоторое время, чтобы обучить «решающего», какой метод использовать. Я бы сказал, что этот метод не может быть совершенным, поэтому он носит вероятностный характер. x,y,z действительно влияют на «решающий». Я думаю, что очень наивная реализация будет заключаться в том, чтобы дать как 1/2 шанс в начале, а затем начать одобрять их в соответствии с прошлой работой. Это не учитывает x,y,z. Во всяком случае, пожалуйста, поделитесь своей эвристикой, вашим опытом, если таковые имеются, вашими советами по этому вопросу.Как решить, используя PLINQ и LINQ во время выполнения?

Пример кода:

public interface IComputer { 
    decimal Compute(decimal x, decimal y, decimal z); 
} 

public class SequentialComputer : IComputer { 
    public decimal Compute(... // sequential implementation 
} 

public class ParallelComputer : IComputer { 
    public decimal Compute(... // parallel implementation 
} 

public class HybridComputer : IComputer { 
    private SequentialComputer sc; 
    private ParallelComputer pc; 
    private TheDecider td; // Helps to decide between the two. 

    public HybridComputer() { 
     sc = new SequentialComputer(); 
     pc = new ParallelComputer(); 
     td = TheDecider(); 
    } 

    public decimal Compute(decimal x, decimal y, decimal z) { 
     decimal result; 
     decimal time; 
     if (td.PickOneOfTwo() == 0) { 
      // Time this and save result into time. 
      result = sc.Compute(...); 
     } else { 
      // Time this and save result into time. 
      result = pc.Compute(); 
     } 
     td.Train(time); 
     return result; 
    } 
} 
+0

Хорошая идея - но у нее есть одна проблема. Что делать, если пользователь выполняет какую-либо другую длительную операцию в другом потоке во время одного метода, но не в другом? Результатом будет то, что случай, когда другой процесс крал процессорное время, выглядит хуже, чем есть на самом деле. Вам нужно будет использовать какой-то способ отслеживания того, сколько времени система тратит только на ваш процесс. –

+0

@Billy, хороший комментарий - продолжайте. Я вспоминаю о практикующих. –

+0

Кто-то упомянул жесткое кодирование ... это может быть способ сделать это. Тогда мой вопрос: я должен оставить неповрежденным (если утверждение + тесты), так что легко переключаться с коммутатором так или иначе, если предположения меняются? Это не должно стать темой PHD. –

ответ

1

Я хотел бы удалить компьютерные специализаций и использовать WithDegreeOfParallelism на код PLINQ. Просто верните свой ресивер 1, если он узнал, что параллелизм не является оптимальным.

Смежные вопросы