我有一個多線程應用程序,比較兩個List o1和o2中的CompareRow,並獲得相似度,然後在列表中存儲o1.CompareRow,o2.CompareRow和Similarity ,因爲getSimilarity過程非常耗時,而且數據通常超過1000,所以使用多線程應該幫助,但事實上,它不是,請 幫助指出的是,幾件事情我已經考慮的是多線程並沒有改善性能,但使其更慢
1. Database shouldnot be a problem, cause i already load the data into
two List<>
2. There is no shared writable data to complete
3. the order of the records is not a problem
請求幫助,這是緊急的,截止日期是接近的....
public class OriginalRecord
{
public int PrimaryKey;
public string CompareRow;
}
===============================================
public class Record
{
// public ManualResetEvent _doneEvent;
public string r1 { get; set; }
public string r2 { get; set; }
public float similarity { get; set; }
public CountdownEvent CountDown;
public Record(string r1, string r2, ref CountdownEvent _countdown)
{
this.r1 = r1;
this.r2 = r2;
//similarity = GetSimilarity(r1, r2);
CountDown = _countdown;
}
public void ThreadPoolCallback(Object threadContext)
{
int threadIndex = (int)threadContext;
similarity = GetSimilarity(r1, r2);
CountDown.Signal();
}
private float GetSimilarity(object obj1, object obj2)
{
//Very time-consuming
ComparisionLibrary.MatchsMaker match
= new ComparisionLibrary.MatchsMaker (obj1.ToString(), obj2.ToString());
return match.Score;
}
}
================================================================
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
List<OriginalRecord> oList1=... //get loaded from database
List<OriginalRecord> oList2 =... //get loaded from database
int recordNum = oList1.Count * oList2.Count;
CountdownEvent _countdown = new CountdownEvent(recordNum);
Record[] rArray = new Record[recordNum];
int num = 0;
for (int i = 0; i <oList1.Count; i++)
{
for (int j = 0; j < oList2.Count; j++)
{
//Create a record instance
Record r
=new Record(oList1[i].CompareRow,oList2[j].CompareRow,ref _countdown);
rArray[num]=r;
//here use threadpool
ThreadPool.QueueUserWorkItem(r.ThreadPoolCallback, num);
num++;
}
}
_countdown.Wait();
List<Record> rList = rArray.ToList();
PopulateGridView(rList);
}
這裏是我在調試模式下拍攝的照片 引起我注意的兩件事是 1.只有4個線程創建工作,但我設置線程池中的minthreads是10 2.正如你所看到的,甚至4個線程創建的,但只有一個線程在任何時間工作, 更糟糕的是,有時沒有線程是由方式工作 ,該ComparisionLibrary是我下載做繁重的工作
我不能交庫照片,你會請給我一封電子郵件或者我可以把照片發給你,謝謝。
我認爲這是建議使用PLINQ http://msdn.microsoft.com/en-us/library/dd997425.aspx而不是線程池。你可以輕鬆地做到這一點。 – 2012-03-21 07:43:39
我試過了,但並不是真的平行。ForEach(oList1,(o1,state,i)=> {Parallel.ForEach(oList2,(o2,state1,i1)=> {記錄r =新記錄(o1.CompareRow,o2.CompareRow); rList.Add(r );});}); rList是concurrentBag – 2012-03-21 07:48:53
我也推薦使用plinq(parallel for)。另外你應該注意的是,如果你的處理器沒有足夠的物理內核(超線程並不總是像廣告所說的那樣工作),那麼在多線程中運行一個程序實際上會減慢一切。 – linkerro 2012-03-21 07:56:42