我正在爲通過正則表達式解析字典和不適用於DateTime元素的列表編寫一些代碼。下面的代碼可以工作,而且工作得很好。但是,當我回頭看到這個Parallel.ForEach是我寫的。我的問題很簡單,如果我鎖定線程,使用Parallel.ForEach會有性能提升嗎?我覺得這似乎擊敗了整個目的。鎖定到單線程的異步編程和並行編程的性能
此外,我覺得好像同樣的想法/問題適用於異步情況,因爲我鎖定了線程。
namespace StackOverflowExample
{
public class ScheduledTimeList : List<ScheduledTime>
{
public static ScheduledTimeList Parse(
Dictionary<string, string> dateTimeStrings, string startRegex,
string endRegex, object sync)
{
var scheduledTimes = new ScheduledTimeList();
Parallel.ForEach(from dt in dateTimeStrings.AsParallel()
select ParseScheduledTime(dt, startRegex, endRegex), dt =>
{
lock (sync) { scheduledTimes.Add(dt); }
});
return scheduledTimes;
}
private static ScheduledTime ParseScheduledTime(
KeyValuePair<string, string> dateTime, string startRegex,
string endRegex)
{
var startString =
dateTime.Key + " " + new Regex(startRegex).Match(dateTime.Value);
var endString =
dateTime.Key + " " + new Regex(endRegex).Match(dateTime.Value);
var startDateTime = DateTime.Parse(startString);
var endDateTime = DateTime.Parse(endString);
return new ScheduledTime(startDateTime,
endDateTime);
}
private static async Task<ScheduledTime> ParseScheduledTimeAsync(
KeyValuePair<string, string> dateTime, string startRegex,
string endRegex)
{
var startString = Task.Run(() =>
dateTime.Key + " " + new Regex(startRegex).Match(dateTime.Value).Value);
var endString = Task.Run(() =>
dateTime.Key + " " + new Regex(endRegex).Match(dateTime.Value).Value);
await Task.WhenAll(startString, endString);
var startDateTime = await Task.Run(() =>
DateTime.Parse(startString.Result));
var endDateTime = await Task.Run(() =>
DateTime.Parse(endString.Result));
return new ScheduledTime(startDateTime,
endDateTime);
}
}
}
代碼中沒有任何內容似乎是CPU密集型的。我會認爲這個代碼的性能會更差,試圖平行進行。你是否使用單線程來嘗試代碼? – Enigmativity
「是否有性能增益」 - 你的性能測量告訴你什麼? –