我正在创建一个控制台程序,它可以通过模拟多个客户端来测试对Cache的读/写,并编写了以下代码。请帮助我理解:
void Main()
{
List<Task<long>> taskList = new List<Task<long>>();
for (int i = 0; i < 500; i++)
{
taskList.Add(TestAsync());
}
Task.WaitAll(taskList.ToArray());
long averageTime = taskList.Average(t => t.Result);
}
public static async Task<long> TestAsync()
{
// Returns the total time taken using Stop Watch in the same module
return await Task.Factory.StartNew(() => // Call Cache Read / Write);
}
答案 0 :(得分:2)
稍微调整一下您的代码,看看我们在特定时间有多少线程。
public MainFrame(){
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(600,400);
//create new panel and add panel to frame
JPanel pnlImg=new JPanel();
add(pnlImg);
//create new label for showing image
JLabel lblShowImg;
BufferedImage image = null;
try {
image = ImageIO.read(new File("1.jpg"));
} catch (IOException ex) {
Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
}
ImageIcon ii=new ImageIcon(image.getScaledInstance(300,300,Image.SCALE_SMOOTH));
lblShowImg=new JLabel(ii);
/*add label to panel */
pnlImg.add(lblShowImg);
/* show frame*/
setVisible(true);
}
结果是:在虚拟机内部,如果我不使用提示,我会同时运行2到10个线程。提示 - 最多100个。在真机上我可以同时看到1000个线程。 Process explorer确认了这一点。 <{3}}的一些有用的详细信息。
答案 1 :(得分:2)
如果它非常繁忙,那么显然您的客户必须等待一段时间才能提供服务。您的程序无法衡量这一点,因为您的秒表在服务请求开始时开始运行。
如果您还想测量请求完成前的平均时间内发生的情况,您应该在发出请求时启动秒表,而不是在请求服务时启动。
您的程序只接受线程池中的线程。如果你开始更多的任务然后有线程,一些任务将必须等待TestAsync开始运行。如果您记得调用Task.Run的时间,则会测量此等待时间。
除了时间测量的缺陷外,您还期望同时获得多少服务请求?你的线程池中是否有足够的空闲线程来模拟这个?如果您预计同时有大约50个服务请求,并且线程池的大小只有20个线程,那么您将永远不会同时运行50个服务请求。反之亦然:如果您的线程池大于预期的同时服务请求数,那么您将测量的时间长于实际情况。
考虑更改线程池中的线程数,并确保没有其他人使用池中的任何线程。