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

C#程序在多个实例上运行缓慢,c#,.net,C#,.net,现在有几天我在练习C#的一些程序。我在这个节目里有个问题 我已经创建了这个程序,它花了21秒来执行,我的CPU使用率是20%,Ram使用率是1Gb最大 static void Main(string[] args) { string str = Console.ReadLine(); if (str == "start") { Stopwatch sw = new Stopwatch();

现在有几天我在练习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();
    }
static void Main(字符串[]args)
{
string str=Console.ReadLine();
如果(str==“开始”)
{
秒表sw=新秒表();
sw.Start();
对于(int i=1;i<200000;i++)
{
Console.WriteLine(“accessed Value”+i.ToString());
控制台写入线(“时间”+sw.ElapsedMilliseconds);
}
}
Console.Read();
}
但当我创建两个这样的实例时,它花费了140秒,CPU使用率为20%,Ram使用率最高为1GB


您能否帮助我,我如何运行多个实例,这些实例将花费21秒,但可以最大限度地利用我的Ram和CPU。

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

您使用的是
控制台。WriteLine
方法是一种IO方法,对于多线程操作()不能很好地扩展,并且不支持异步操作。所以你很可能无法控制这一切

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

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

 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();
}
static void Main(字符串[]args)
{
string str=Console.ReadLine();
如果(str==“开始”)
{
秒表sw=新秒表();
var builder=新的StringBuilder();
对于(int i=1;i<200000;i++)
{
sw.Start();
builder.Clear();
字符串a=builder.Append(“已访问的值”).Append(i.ToString()).ToString();
builder.Clear();
字符串b=builder.Append(“Time”).Append(sw.elapsedmillisons);
控制台写入线(a);
控制台写入线(b);
}
}
Console.Read();
}

这个程序有什么意义?将它写入控制台并不会消耗所有的cpu,cpu的IO上有很多等待。尝试
while(true)在所有内核上。我有两个并行函数,当我运行一个时需要x时间,但当我并行运行两个时需要2倍时间。CPU和内存的使用在这两种情况下都是一样的。是的,但是当你完全用一个输出到控制台的程序来替换实际工作时,不能保证任何建议都会与你原来的问题联系起来。如果你能创建一个至少与你的实际问题有切身关系的程序,你就更有可能得到有用的答案。除了这个程序的主要工作似乎只是输出到控制台。由于锁定了控制台访问,在进程中运行额外副本只会降低速度。我们不知道用户正在处理的真正任务是什么,因此也不知道它是自然资源受限的(就像控制台一样),还是其他任务会有所帮助。我用这段代码尝试了这一点,如果我执行一个任务需要21秒,执行两个任务需要43秒。下面是代码:Task _Task=newtask(()=>GetTest());任务_tasknew=新任务(()=>GetTest1())_task.Start()_tasknew.Start()@编码\u hell,尝试不使用
控制台。WriteLine
,请参阅。IO操作,特别是输出到终端的操作,需要时间,即使使用多线程代码,也无法逃避。这就像一辆法拉利在一条小巷里行驶;它永远不会像在真正的赛道上那样表现。