我有一个看起来像这样的方法:
public void SomeMethodThatLoadsUserData()
{
Method1();
Method2();
Method3();
.....
Method12();
}
这些会在用户登录时执行,并且每个方法都会获取一些与用户相关的数据。我想知道让这些并行运行是否会带来任何性能优势,因为每个方法最终都会调用对同一个数据库文件的查询。而且,如果有性能优势,我将如何重写这段代码?
感谢您的建议。
我有一个看起来像这样的方法:
public void SomeMethodThatLoadsUserData()
{
Method1();
Method2();
Method3();
.....
Method12();
}
这些会在用户登录时执行,并且每个方法都会获取一些与用户相关的数据。我想知道让这些并行运行是否会带来任何性能优势,因为每个方法最终都会调用对同一个数据库文件的查询。而且,如果有性能优势,我将如何重写这段代码?
感谢您的建议。
以下代码演示了使用 Thread 和 Stopwatch 对象列表的并行测试。我认为这是一个很好的测试方法,因为它保证了并行执行尝试(与 Parallel.Invoke 不同),并且比使用 ThreadPool IMO 更容易设置。
public static void SomeMethodThatLoadsUserData()
{
Stopwatch s = new Stopwatch();
s.Start();
List<Thread> threads = new List<Thread> {new Thread(Method1), new Thread(Method2)};
foreach (Thread thread in threads)
{
thread.Start();
}
foreach (Thread thread in threads)
{
thread.Join();
}
s.Stop();
Console.WriteLine("Total: {0} ms", s.ElapsedMilliseconds);
Console.ReadKey();
}
private static void Method1()
{
Stopwatch s = new Stopwatch();
s.Start();
// do work
Thread.Sleep(1000);
s.Stop();
Console.WriteLine("Method 1: {0} ms", s.ElapsedMilliseconds);
}
private static void Method2()
{
Stopwatch s = new Stopwatch();
s.Start();
// do work
Thread.Sleep(1000);
s.Stop();
Console.WriteLine("Method 2: {0} ms", s.ElapsedMilliseconds);
}
输出:
Method 1: 999 ms
Method 2: 999 ms
Total: 1051 ms
Total
当(希望)小于每种方法的总和时,将显示任何时间节省。
我不知道这是否是最快或最好的方法,但您可以将每种方法转入一个新线程。
Thread t = new Thread(() => Method1());
t.Start();