我试图用Java Executor框架弄脏自己。所以我创建的任务只是字符串操作
使用for循环
for(int i = 0; i < noOfTimes; i++)
str = str + 't';
现在我的计划是连续执行此任务(逐个执行for循环)并行执行(使用Executor框架并立即提交所有作业并让它运行) 并且比较了他们的表现。所以我在测试用例下执行。我有8GB内存的机器和处理器 - 英特尔i7,我认为它有8个内核。
1.无任务(任务) - 30000,每项任务将循环1000(noOfTimes)
2.没有任务(任务) - 30000并且每个任务将循环5000(noOfTimes)
3.没有任务(任务) - 5000并且每个任务将循环15000(noOfTimes)
案例1&amp;正如预期的那样,它清楚地表明,与串行执行相比,多线程方法花费的时间更少 但案例3几乎是反向的。所以我有以下问题
1。什么时候我们应该采用串行执行或多线程方法(利用Exrofor框架的多核机器)
用于处理大量数据(假设我想处理30000个员工记录)
2。我在上面的测试案例中观察到,在单个任务处理不耗时(循环1000次)的情况下,多线程方法要快得多 但是一旦我增加了单个任务的处理时间(循环15000),与串行执行相比,它几乎花费了两倍的时间。
3。我想检查http://embarcaderos.net/2011/01/23/parallel-processing-and-multi-core-utilization-with-java/中提到的任务管理器中的CPU使用率 但CPU没有100%使用所有核心?
答案 0 :(得分:0)
首先,您应该尝试其他测试。
String
是不可变的,所以做str = str + "t"
实际上并不是线性的:只添加一个字符意味着每次重建整个字符串。
另外因为Java中的字符串池,我不是100%肯定String
是测试并发性的最佳对象。
其次,并发性增加了程序的复杂性以及诸如死锁,竞争条件等计划外行为的风险......糟糕的并发设计可能效率低于平均串行设计。
因此,如果您对自己的计划感到满意并且表现不错,请不要多线程。如果您对性能不满意,请首先尝试找出原因并改进您的串行设计。只有这样你才能添加多线程,但你真的需要知道你在做什么。