C#程序在多个实例上运行缓慢

时间:2017-01-11 07:10:04

标签: c# .net

现在,我正在练习一些C#程序。我在这个程序中遇到了一个问题。

我创建了这个程序,执行时间为21秒,CPU使用率为20%,Ram使用率为1Gb。

      static void Main(string[] args)
    {
        string str = Console.ReadLine();

        if (str == "start")
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 1; i < 200000; i++)
            {


                Console.WriteLine("Acccessed Value" + i.ToString());
                Console.WriteLine("Time " + sw.ElapsedMilliseconds);

            }
        }
        Console.Read();
    }

但是当我创建2个这样的实例时耗时140秒,CPU使用率为20%,Ram使用率最大为1GB。

你能帮助我吗,我怎样才能运行多个实例,这些实例需要21秒,但可以最大限度地利用我的Ram和CPU。

2 个答案:

答案 0 :(得分:1)

您不想要启动不同的实例。尝试在应用程序中使用Task,以利用CPU的多个内核。创建Environment.ProcessorCount个任务并对其执行操作。还有一个更高级别的抽象 - Parallel,您可以查看。

答案 1 :(得分:0)

您正在使用Console.WriteLine方法,这是一种IO方法,并且不能很好地扩展到多线程操作(see here),并且不支持异步操作。所以你很可能无法控制它。

但问题是,你真的需要这样的申请吗?我不这么认为;没有人想要立即为输出写入那么多的文本。写入文件,也许,它支持异步操作。

作为一个简单的改进,您可以使用StringBuilder而不是创建许多短期String对象,如下所示:

 static void Main(string[] args)
{
    string str = Console.ReadLine();

    if (str == "start")
    {
        Stopwatch sw = new Stopwatch();

        var builder = new StringBuilder();

        for (int i = 1; i < 200000; i++)
        {
            sw.Start();

            builder.Clear();
            string a = builder.Append("Acccessed Value").Append(i.ToString()).ToString();

            builder.Clear();
            string b = builder.Append("Time ").Append(sw.ElapsedMilliseconds);

            Console.WriteLine(a);
            Console.WriteLine(b);

        }
    }
    Console.Read();
}