Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual Studio C#2010 Express调试运行速度比发行版快_C#_Debugging_Visual Studio Debugging_Visual C# Express 2010 - Fatal编程技术网

Visual Studio C#2010 Express调试运行速度比发行版快

Visual Studio C#2010 Express调试运行速度比发行版快,c#,debugging,visual-studio-debugging,visual-c#-express-2010,C#,Debugging,Visual Studio Debugging,Visual C# Express 2010,我有一个Windows窗体应用程序,正好有两个线程。这些线程彼此之间没有交互,第一个线程运行时不会干扰第二个线程。它们之间没有同步,因为不需要同步。第一个线程处理应用程序的UI,更改颜色和标签,并有一个计时器运行以捕获一些用户输入,该计时器每200毫秒触发一次。第二个线程更为复杂,不断地运行其编码,直到用户退出应用程序关闭为止 第二个线程首先从内存中读取数据并将其存储到列表中,然后使用这些数据进行一些计算。我有一个秒表类计时器来测量完成第二个线程的一次迭代所需的时间。此计时器在线程的最开始处重置

我有一个Windows窗体应用程序,正好有两个线程。这些线程彼此之间没有交互,第一个线程运行时不会干扰第二个线程。它们之间没有同步,因为不需要同步。第一个线程处理应用程序的UI,更改颜色和标签,并有一个计时器运行以捕获一些用户输入,该计时器每200毫秒触发一次。第二个线程更为复杂,不断地运行其编码,直到用户退出应用程序关闭为止

第二个线程首先从内存中读取数据并将其存储到列表中,然后使用这些数据进行一些计算。我有一个秒表类计时器来测量完成第二个线程的一次迭代所需的时间。此计时器在线程的最开始处重置和启动,然后在线程完成迭代后停止并打印到控制台。这就是我获取性能数据的地方。我已经允许线程运行至少1000次迭代,然后进行平均,不包括第一次运行

构建的调试版本,即由VSHOST运行的构建,或在Visual Studio C#2010 Express中点击F5时运行的构建。计时的平均值为0.00035s,即0.35ms

当应用程序在VSHOST之外运行时,可以通过按Ctrl-F5或从按BUILD时生成的.exe运行应用程序。我还使用REBUILD测试了绝对零更改。时间平均为0.365s,即365ms。这大约比发布版本慢1000倍

我完全不知道发生了什么事。VSHOST在做什么使程序运行得如此之快。我已经确保所有变量的初始化都是正确的。尽管如此,我不知道为什么会发生这样的事情。关于我为什么表现如此低落,有什么见解吗

作为补充说明,我使用的计算机是64位的,它有一个四核i7,带有超线程、16G的ram和两个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);
                }
            }

        }
    }
}
名称空间测试片段
{
公共结构数据
{
公共浮动X;
公众浮躁;
公共浮动Z;
公共浮动dX;
公开募捐;
公共数据(INTC)
{
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;
}
该值为0.dX=0;
这是0.dY=0;
}
}
一班
{
public int Base=new int();
公共列表数据=新列表();
public int targetindex=new int();
公共数据targetdata=新数据();
public void GetData()
{
while(true)
{
data.Clear();
for(int c=0;c<64;c++)
{
Data tempdata=新数据();
teampdata=新数据(c);
data.Add(tempdata);
}
如果(data.Count!=0)
{
targetdata=数据[targetindex];
数据删除(targetindex);
targetdata.dX=ReadFloat(基本+0x66);
targetdata.dY=ReadFloat(基数+0x65);
Data[]tempdatarray=新数据[Data.Count];
对于(int j=0;j
}


编辑::我尝试了相同的过程,但没有使用线程。我用定时器调用线程函数来捕捉用户输入。我得到了同样的结果。这意味着线程似乎不是问题所在。我也在另一台电脑上做了测试,出于某种原因,我没有得到巨大的差异。这让我相信我的电脑可能有问题,或者由于超线程能力,我的处理器处理线程的方式有问题。任何人都知道超线程是否会导致多线程应用程序出现问题,而该应用程序没有在程序中明确使用超线程。老实说,我不知道如何设置。

我看不到任何东西表明您正在选择发布版本。这是工具栏上的一个选项。如果您直接运行调试构建,可能它正在查找找不到的内容


编辑:除了我错过的标题!!!!:-)

这个问题与超读无关。我找不到这个链接,但是英特尔在2004年对它的工作原理做了一个很好的技术描述(没有任何市场宣传)。但它的缺点是:核心0可能是一个真正的核心,而核心1可能是一个逻辑核心,与核心0共享相同的硬件。从我们的角度来看(应用程序开发人员),核心0和1都是真实的,我们不必关心核心1是逻辑核心这一事实(除了显而易见的情况,逻辑核心总体上只提供了大约13-30%的性能提升,这同样在技术描述中提到)。Windows在跨实核和逻辑核调度线程方面做得相当好。您所要做的就是创建两个线程,Windows将在核心0和1上各运行一个线程。如果要进行实验,可以在BIOS中禁用超线程,以编程方式设置线程的处理器关联,或从任务管理器中设置关联

也就是说,实验