Ищите небольшой совет по использованию AsParallel()
или Parallel.ForEach()
, чтобы ускорить это.
См. метод, который у меня есть (упрощенный/бастардованный для этого примера) ниже.
Требуется список, например "US, FR, APAC", где "APAC" является псевдонимом для 50 других "US, FR, JP, IT, GB" и т.д. Этот метод должен принимать "US, FR, APAC" и преобразовывать его в список "США", "FR" и все страны, находящиеся в "APAC".
private IEnumerable<string> Countries (string[] countriesAndAliases)
{
var countries = new List<string>();
foreach (var countryOrAlias in countriesAndAliases)
{
if (IsCountryNotAlias(countryOrAlias))
{
countries.Add(countryOrAlias);
}
else
{
foreach (var aliasCountry in AliasCountryLists[countryOrAlias])
{
countries.Add(aliasCountry);
}
}
}
return countries.Distinct();
}
Делает ли это распараллеливание столь же простым, как изменить его на то, что ниже? Есть ли больше нюансов в использовании AsParallel()
, чем это? Должен ли я использовать Parallel.ForEach()
вместо foreach
? Какие эмпирические правила следует использовать при распараллеливании циклов foreach
?
private IEnumerable<string> Countries (string[] countriesAndAliases)
{
var countries = new List<string>();
foreach (var countryOrAlias in countriesAndAliases.AsParallel())
{
if (IsCountryNotAlias(countryOrAlias))
{
countries.Add(countryOrAlias);
}
else
{
foreach (var aliasCountry in AliasCountryLists[countryOrAlias].AsParallel())
{
countries.Add(aliasCountry);
}
}
}
return countries.Distinct();
}