我有一个 Windows Forms 应用程序,其中恰好有两个线程。这些线程彼此之间没有任何交互,第一个线程运行时不会干扰第二个线程。它们之间没有同步,因为没有必要这样做。第一个线程处理应用程序的 UI,改变颜色和标签,并有一个定时器每 200 毫秒启动一次以捕获一些用户输入。第二个线程更加复杂,通过其代码不断地运行,直到用户通过退出应用程序来关闭它。
第二个线程首先从内存中读取数据并将其存储到列表中,然后使用这些数据进行一些计算。我有一个 StopWatch 类计时器来测量完成第二个线程的一次迭代所需的时间。该计时器在线程的开头被重置并启动,然后在线程完成一次迭代后停止并打印到控制台。这就是我获取性能数据的地方。我允许线程运行至少 1000 次迭代,然后计算平均值,不包括第一次运行。
DEBUG 版本的构建(即由 VSHOST 运行或在 Visual Studio C# 2010 Express 中按 F5 运行的构建)。计时平均值为 0.00035 秒,即 0.35 毫秒。
当应用程序在 VSHOST 外运行时,即通过按 Ctrl-F5 或运行从 BUILD 按钮生成的 .exe 文件时。我还使用了 REBUILD 进行测试,但没有任何改变。计时平均值为 0.365 秒,即 365 毫秒。这意味着 Release Build 要慢大约 1000 倍。
我完全不知道发生了什么。为什么 VSHOST 可以让程序运行得如此迅速。我确保所有变量初始化都被考虑并正确处理。话虽如此,我不知道为什么会发生这种情况。有没有关于为什么出现这样性能下降的任何见解?
作为一个旁注,我使用的电脑是 64 位,具有四核 i7 和超线程技术,16 GB 的内存和双 HD6750。因此,似乎问题不在于有过多的线程,这里可能存在问题的唯一事情是超线程。下面是我的应用程序所做的一段代码片段,但是由于慢读取内存地址是导致缓慢的原因,因此不可能提供工作代码。
第二个线程首先从内存中读取数据并将其存储到列表中,然后使用这些数据进行一些计算。我有一个 StopWatch 类计时器来测量完成第二个线程的一次迭代所需的时间。该计时器在线程的开头被重置并启动,然后在线程完成一次迭代后停止并打印到控制台。这就是我获取性能数据的地方。我允许线程运行至少 1000 次迭代,然后计算平均值,不包括第一次运行。
DEBUG 版本的构建(即由 VSHOST 运行或在 Visual Studio C# 2010 Express 中按 F5 运行的构建)。计时平均值为 0.00035 秒,即 0.35 毫秒。
当应用程序在 VSHOST 外运行时,即通过按 Ctrl-F5 或运行从 BUILD 按钮生成的 .exe 文件时。我还使用了 REBUILD 进行测试,但没有任何改变。计时平均值为 0.365 秒,即 365 毫秒。这意味着 Release Build 要慢大约 1000 倍。
我完全不知道发生了什么。为什么 VSHOST 可以让程序运行得如此迅速。我确保所有变量初始化都被考虑并正确处理。话虽如此,我不知道为什么会发生这种情况。有没有关于为什么出现这样性能下降的任何见解?
作为一个旁注,我使用的电脑是 64 位,具有四核 i7 和超线程技术,16 GB 的内存和双 HD6750。因此,似乎问题不在于有过多的线程,这里可能存在问题的唯一事情是超线程。下面是我的应用程序所做的一段代码片段,但是由于慢读取内存地址是导致缓慢的原因,因此不可能提供工作代码。
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);
}
}
}
}
}
编辑:我尝试了相同的步骤,但没有使用线程。我让计时器调用线程函数来捕获用户输入。我得到了相同的结果。这意味着线程似乎不是问题所在。我还在另一台计算机上进行了测试,出现巨大差异的原因不明。这让我相信我的计算机可能有问题,或者与我的处理器如何处理线程有关,因为它具有超线程功能。是否有人知道超线程是否会导致多线程应用程序出现问题,而该程序未在程序内显式地利用它。说实话,我不知道如何设置。