小编Nom*_*101的帖子

Visual Studio C#2010 Express Debug运行速度比发布速度快

我有一个Windows Forms应用程序,正好有2个线程.这些线程彼此之间有ZERO交互,Ala运行第一个线程而不会弄乱第二个线程.它们之间没有同步,因为不需要发生这种情况.第一个线程处理应用程序的UI,更改颜色和标签,并运行一个计时器来捕获一些用户输入,此计时器每200毫秒触发一次.第二个线程涉及更多,并且不断地运行其编码,直到用户退出应用程序关闭.

第二个线程首先从内存中读取并将数据存储到List中,然后使用此数据进行一些计算.我有一个StopWatch类计时器来测量完成第二个线程的一次迭代所需的时间.该计时器在线程的最开始复位并启动,然后在线程完成迭代后停止并打印到控制台.这是我获取性能数据的地方.我一直允许Thread运行至少1000次迭代,然后做一个不包括第一次运行的平均值.

构建的DEBUG版本,即由VSHOST运行的构建,或者在Visual Studio C#2010 Express中运行F5的构建.时间平均值为0.00035s,即0.35ms.

当应用程序在VSHOST之外运行时,可以通过按Ctrl-F5或从命中BUILD时生成的.exe运行应用程序.我还使用REBUILD来测试这个绝对的ZERO变化.时间平均为.365s,即365ms.这与Release Build相比大约慢了1000倍.

我完全不知道发生了什么.VSHOST做的是什么让程序运行得如此之快.我确保所有变量初始化都被考虑并且正确.话虽如此,我不知道为什么这样的事情会发生.任何关于我为什么获得这样的表现的见解Dip?

作为旁注,我使用的计算机是64位,具有超线程的四核i7,16 GB的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 …
Run Code Online (Sandbox Code Playgroud)

c# debugging visual-studio-debugging visual-c#-express-2010

7
推荐指数
1
解决办法
1691
查看次数

秒表经过时间线程安全

好吧,我有一个相当简单的问题,但我找不到简洁的答案。我想知道在读取仍在运行的lock()一段时间的已用属性时是否需要担心调用语句。Stopwatch

这也是Stopwatch我应该用来测量线程运行时间的东西。我读过其他类似的问题,DispatchTimer可以使用 a 。我也研究过使用事件,但是对于如此简单的事情来说,这似乎是很大的开销,如果这是完全错误的并且我应该使用事件,请告诉我。一些简单的代码来说明我在说什么。

 class foo
 {
      private bool _isRunning { get; set; }
      private Stopwatch sw { get; set; }
      public void StartThread()
      {
          this._isRunning = true;
          new Thread(new ThreadStart(this.DoWork)).Start();
          this.sw.Restart();
      }     
      public void StopThread()
      {
          this._isRunning = false;
          this.sw.Stop();
      }
      private void DoWork()
      {
          while(this._isRunning)
          {
               //Do Stuff
          }
      }
      public TimeSpan GetRuntime()
      {
          return this.sw.Elapsed;
      }
      public foo()
      {
          _isRunning = false;
          sw = new Stopwatch();
      }
 }
Run Code Online (Sandbox Code Playgroud)

假设在使用上述类的应用程序中,我要在GetRuntime() …

.net c# multithreading thread-safety

4
推荐指数
1
解决办法
4166
查看次数