现在,我正在练习一些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。
答案 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();
}