描述及問題如下:
1.在開始執行緒startTrd后,s1 s2為兩個并發執行的執行緒,兩個執行緒都執行完畢后,do somethings,然后再并發這兩個執行緒,直到條件滿足后才退出回圈。
2.現象為這個程式在和我筆記本(有且只有SSD)配置差不多的臺式電腦(無SSD)運行的時候,運行速度大打折扣。比如,同運行條件下,在我筆記本運行可以達到采集300點,在臺式上只能100左右。
3.在采集的程序中,明顯硬碟燈會偶爾閃,猜測是不是有.net的環境執行緒也在動態從硬碟讀取資料,因此造成了兩臺配置相近的電腦運行效率的差異。
4.對.net的機理不是很懂,是不是有這種程式(無硬碟IO操作)執行期間會有讀盤的可能性;或者windows系統就是這樣的:總是會有讀盤的執行緒存在,時不時進行讀寫硬碟的操作。
5.如果是SSD的影響,能不能把程式運行時必須的全部代碼(包括庫代碼)全部讀入記憶體來避免程式運行期間讀盤?
private OriDat dynData;
private bool ifEnd = false;
private MeasureResult measureResult = new MeasureResult();
private void startBtn_Click(object sender, EventArgs e)
{
startThread = new Thread(startTrd);
startThread.Start(new startCallBackDelegat(startTrdCallBack));
}
private void startTrd(object o)
{
List<OriDat> oriDats = new List<OriDat>();
motor.start("500");
motorDelegate mDelegate = new motorDelegate(s2);
laserDelegate lDelegate = new laserDelegate(s1);
ifEnd = false;
do
{
dynData = new OriDat();
IAsyncResult m = mDelegate.BeginInvoke(new AsyncCallback(s2Complete), mDelegate);
IAsyncResult l = lDelegate.BeginInvoke(new AsyncCallback(s1Complete), lDelegate);
m.AsyncWaitHandle.WaitOne();
l.AsyncWaitHandle.WaitOne();
string pos = string.Format("{0:F4}", dynData.Pos / 10m);
oriDats.Add(dynData);
this.Invoke(new EventHandler(delegate { textBox5.Text = dynData.Diameter[0]; textBox6.Text = pos; }));
} while (!motor.IfStop2p && !ifEnd);
measureResult.oriDats = oriDats;
startCallBackDelegat callBack = o as startCallBackDelegat;
callBack();
}
private void s1Complete(IAsyncResult iar)
{
Thread.CurrentThread.Priority = ThreadPriority.Highest;
string[] ss = new string[2];
laserDelegate task = (laserDelegate)iar.AsyncState;
ss = task.EndInvoke(iar);
if (ss[0] == "-999.9999" && ss[1] == "-999.9999")
{
motor.disable();
ifEnd = true;
return;
}
dynData.Diameter[0] = string.Format("{0:F4}", d1);
dynData.Diameter[1] = string.Format("{0:F4}", d2);
}
private void s2Complete(IAsyncResult iar)
{
Thread.CurrentThread.Priority = ThreadPriority.Highest;
motorDelegate task = (motorDelegate)iar.AsyncState;
dynData.Pos = task.EndInvoke(iar);
}
private string[] s1()
{
Thread.CurrentThread.Priority = ThreadPriority.Highest;
return laser.getValue();
}
private decimal s2()
{
Thread.CurrentThread.Priority = ThreadPriority.Highest;
return motor.pos();
}
uj5u.com熱心網友回復:
會,磁盤IO一般都是固定的,比如7200轉10000轉,一般程式很難超過這個吞吐量,如果你實在不放心可以使用固態硬碟uj5u.com熱心網友回復:
我已經訂上SSD了,這個問題的出現真是讓我想了很多:
1.按照以前的理解,系統開機且趨于穩定后只要沒有用戶和系統互動,也沒有自動任務,系統是不會有硬碟IO的,但實際是有的,那么SSD對windows的提升不只是開機,從開機后這種提升就一直存在且持續。
2.我這個設備其實應該用MCU+大RAM來實作這種實時處理與緩沖,果然是各有各的擅長領域,開著加長勞斯萊斯穿胡同買菜就是個笑話。
3.我還想請問,對于arm架構下,比如QT或者Android等類Linux系統也會存在這種問題嗎?
uj5u.com熱心網友回復:
一樣的啊,只要是程式運行都存在對硬碟的讀寫,作業系統無非是一個大的程式而已。uj5u.com熱心網友回復:
這主要考驗硬碟的隨機讀寫能力,而不是順序讀寫能力。SSD的隨機 IO 速度甩機械盤幾條街,這與 .net 無關,而是和硬體以及作業系統有關。另外現在的作業系統越來越復雜,后臺執行的任務越來越多,即使你不操作它,也會不定時地訪問硬碟的,例如檢查網路、空閑時間查毒、寫日志、下載補丁等。uj5u.com熱心網友回復:
看來我遇到的問題還是作業系統導致的,謝謝指點
uj5u.com熱心網友回復:
你從來沒好奇過,你的系統盤底下有個pagefile.sys超大檔案(如果你自己沒改默認路徑的話)這是虛擬記憶體頁檔案。一個行程可以分配nG記憶體,那么windows跑了那么多行程,你加起來有多大?物理記憶體不夠把,所以他會把一些東西分在虛擬記憶體里,當然虛擬記憶體是用硬碟虛擬的
所以,你的程式估計對記憶體占用比較高
ps:系統還有一個程式交換檔案swapfile.sys這也是和虛擬記憶體配合的檔案
哎,你們硬碟大啊,估計從來就沒“飄紅”過,我系統盤長期飄紅,所以隔斷時間就要考慮那些東西可以刪了,其實每次都想把那兩個東西給設定到其他地方(太大了),不過因為是系統盤是SSD,移到其他盤上效率就沒那么高了,所以就還是留在系統盤上了
uj5u.com熱心網友回復:
虛擬記憶體早就關掉了啊。
uj5u.com熱心網友回復:
我的SSD在路上,等到了實驗后反饋結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/120282.html
標籤:C#
