提高C#代码的性能

时间:2009-02-16 21:57:36

标签: c# performance multithreading

如何改善以下情况的表现?

我有一个应用程序可以接受网络上的多个连接。应用程序是用C#编写的,并接受Socket连接。每五分钟,应用程序需要执行一个函数调用来更新应用程序并将信息报告回套接字。截断的代码如下

...
{
    new Thread(Loop).Start();
}

public Loop()
{
    ...
    while (true)
    {
        ...
        string line = user.Read();
        ...
    }
    ...
}

上面的代码是Socket连接到服务器时运行的代码。 以下代码是每五分钟运行一次的代码。

...
{
    new Thread(TryTick).Start();
}

public void TryTick()
{
    while(true)
    {
        Tick();
        Thread.Sleep(new TimeSpan(0, 5, 0));
    }
}

Tick()执行一些文件I / O操作以及解析非常有限(小于1MB)的XML数据集。但是,这段代码对我的处理器的影响超出了我的想象。一旦发生滴答,系统似乎抓住了我的双核开发机器的整个Core并且不放手。这似乎相当简单,但也许我这样做很简单,而不是快速的方式。

此系统最多可处理100个用户,更多数据,并且在加载过程中响应时间不到1秒,因此性能是一个问题。

10 个答案:

答案 0 :(得分:5)

在决定做什么之前,您确实需要对此代码进行分析。 。 。如果您无权访问分析器,请添加简单的检测以确定瓶颈的位置。从计时Tick()开始验证它是问题的根源(与程序中的其他地方相反),然后根据需要重复Tick()的子部分。

您真的需要在此处进行分析和衡量。 。 。假设你的性能问题在哪里可能导致你浪费很多时间。

答案 1 :(得分:2)

你正在使用一段时间(真实)。大多数.NET套接字应该实现某种形式的事件处理程序。您可以创建自定义通用事件处理程序,这样除了侦听连接并转发到事件之外,侦听器才真正做其他事情。套接字接收处理程序的一些示例位于http://www.c-sharpcorner.com/Forums/ShowMessages.aspx?ThreadID=37717

当你把所有东西放在while循环中并使用Thread.Sleep()时,你仍在使用处理器,而线程正在“休眠”。

在使用完线程后,还要确保您正在执行Thread.Join()。否则,你会得到许多等待工作的线程,除了占用多余的内存和处理器之外什么都不做。

通常,如果你的代码中有一个while(true)循环和一个Thread.Sleep(),那么你应该问问自己是否做错了什么。在大多数情况下,您是,并且最重要的重点是找出在不使用资源的情况下处理请求的方法。

答案 2 :(得分:1)

您是否尝试在发布模式下进行编译以查看速度是否存在很大差异?

答案 3 :(得分:1)

答案 4 :(得分:0)

我想我必须知道你在Tick中做了什么以及为什么你在Tick中做这件事但是每当我遇到类似情况时我都会使用EventWaitHandles

答案 5 :(得分:0)

你正在递归地打电话给你。顺便说一句,你可以使用一个完全符合你想要的Timer。另请注意,它可能会在某段时间后给出stackoverflow异常 - 不会在主要执行中报告它,因为它是一个线程(为所有未处理的异常设置全局日志以获取信息)。

答案 6 :(得分:0)

您可以查看线程和文件读取操作,以查看系统是否可以更好地分配负载。 IO非常昂贵,因此让它在不同的线程上运行有时可以加快速度。为什么不尝试Parallel Extension for the .NET Framework来帮助它,它们有一些很好的,简单的API函数来帮助使循环并行运行。

答案 7 :(得分:0)

我注意到在公共Loop()中,在while(true)循环中你没有包含Thread.Sleep(0)。如果还没有,你应该考虑添加它。 Thread.Sleep(0)将告诉处理器将分配给该线程的剩余时间用于可能需要它的其他线程/进程。如果没有这样的电话,你基本上就没有充分的理由停留在处理器上。


  public Loop()
  {
      ...
      while (true)
      {
          ...
          string line = user.Read();
          ...
          Thread.Sleep(0);
      }
      ...
  }

这可能不再是您的问题,我的建议可能不适用于您的案例,但由于您尚未披露完整的来源,因此很难准确了解问题的根源。这只是要考虑的事情。

答案 8 :(得分:0)

我建议您使用Timer并使用Tick事件,而不是打开一个线程并让它进入休眠状态。

你也应该写嘀嗒,这样我们可以帮助你更好

答案 9 :(得分:-1)

看起来你对Tick()的调用是递归的。

我还建议您添加一些代码,以便您可以插入关于所关注功能的更好的指标 - 例如运行“Tick”功能需要多长时间。

它真的可以帮助诊断“哎呀!”这些问题。