我有一個Windows Forms應用程序,它有2個線程。這些線程相互之間具有零交互,第一個線程運行時不會與第二個線程混淆。他們之間沒有同步,因爲沒有必要發生這種情況。第一個線程處理應用程序的UI,改變顏色和標籤,並且有一個定時器運行,以捕獲這個定時器每200毫秒觸發的一些用戶輸入。第二個線程更多地涉及並持續運行其編碼,直到用戶退出應用程序關閉。Visual Studio C#2010 Express調試運行速度比Release快更多
第二個線程首先從內存中讀取並將數據存儲到List中,然後使用這些數據進行一些計算。我有一個StopWatch類定時器來測量完成第二個線程的迭代所需的時間。該定時器被重置,並在線程的一開始就啓動,然後一旦線程完成一次迭代就停止並打印到控制檯。這是我得到我的表現數據的地方。我一直允許線程運行至少1000次迭代,然後排除第一次運行的平均值。
構建的DEBUG版本,即由VSHOST運行的構建,或者在Visual Studio C#2010 Express中運行F5的構建。 Timings的平均值爲0.00035s,即0.35ms。
當應用程序在VSHOST外部運行時,可以通過按Ctrl-F5或通過從命中BUILD時產生的.exe運行應用程序。我也用REBUILD來測試這個絕對零變化。時間平均在365秒365秒。發佈版本的速度大約慢了1000倍。
我完全喪失了正在發生的事情。什麼是VSHOST這樣做可以讓程序運行得這麼快。我已經確保所有的變量初始化都是正確的。這就是說,我不知道爲什麼會發生這樣的事情。任何有關爲什麼我得到這樣的表演Dip的見解?
作爲一個側面說明我正在使用的計算機是64位具有超線程,16千兆字節RAM和雙HD6750的四核i7。所以它似乎不是一個線程太多的問題,這裏可能存在的唯一問題就是超線程。
以我的應用程序的形式提供的一段代碼。然而,由於內存地址讀取是發生減速的地方,因此無法提供工作代碼。
namespace Test Snippet
{
public struct Data
{
public float X;
public float Y;
public float Z;
public float dX;
public float dY;
public Data(int c)
{
this.X = ReadFloat(Base + 0x50 + (c * 0x10));
this.Y = ReadFloat(Base + 0x50 + (c * 0x10));
this.Z = ReadFloat(Base + 0x50 + (c * 0x10));
if (this.Z == 1)
{
targetindex = c;
}
this.dX = 0;
this.dY = 0;
}
}
class Class1
{
public int Base = new int();
public List<Data> data = new List<Data>();
public int targetindex = new int();
public Data targetdata = new Data();
public void GetData()
{
while (true)
{
data.Clear();
for (int c = 0; c < 64; c++)
{
Data tempdata = new Data();
teampdata = new Data(c);
data.Add(tempdata);
}
if (data.Count != 0)
{
targetdata = data[targetindex];
data.RemoveAt(targetindex);
targetdata.dX = ReadFloat(Base + 0x66);
targetdata.dY = ReadFloat(Base + 0x65);
Data[] tempdatarray = new Data[data.Count];
for (int j = 0; j < tempdatarray.Length; j++)
{
tempdatarray[j].dX = (float)Math.Acos(targetdata.dX * 10);
tempdatarray[j].dY = (float)Math.Acos(targetdata.dY * 10);
}
}
}
}
}
}
編輯::我曾嘗試相同的程序,但沒有使用線程。我有我用來捕獲用戶輸入的定時器調用的線程函數。我得到了同樣的結果。這意味着線程似乎不是問題。我還在另一臺計算機上完成了測試,出於某種原因,我沒有獲得巨大的差異。這導致我相信我的計算機可能有問題,或者由於其超線程能力而導致我的處理器如何處理線程。任何人都知道,超線程是否會導致多線程應用程序出現問題,而該應用程序並未在程序中明確使用它。說實話,我不知道如何設置。
您是否嘗試使用真正的性能分析工具來分析應用程序? –
對於一個經過深入研究,寫得很好的問題+1 +1 – MikeKulls
很難提供沒有任何代碼的建議來測試。 –