Java - 线程计算更慢
Java - Thread calculate more slowly
我正在尝试更快地计算我的程序。但是使用线程会使它变慢。这是简化的代码:
在这个数组中,尝试对每个数字求和。
例如:个位数=3+6
List<String> myArr = new ArrayList<String>();
myArr.add("123");
myArr.add("456");
当这样计算时:
/* NORMAL USE */
long startTime1 = System.nanoTime();
int units=0; int tens=0; int hundreds=0;
for(int i=0; i < myArr.size(); i++) {
units += Character.getNumericValue(myArr.get(i).charAt(2));
tens += Character.getNumericValue(myArr.get(i).charAt(1));
hundreds += Character.getNumericValue(myArr.get(i).charAt(0));
}
long endTime1 = System.nanoTime();
double estimatedTime1 = (endTime1 - startTime1)/1000000.0;
System.out.println(estimatedTime1 + " milliseconds");
输出:
0.0285 milliseconds
使用线程计算时:
/* USING THREAD */
ExecutorService pool = Executors.newFixedThreadPool(3);
long startTime2 = System.nanoTime();
pool.execute(new UnitsDigit(myArr));
pool.execute(new TensDigit(myArr));
pool.execute(new HundredsDigit(myArr));
pool.shutdown();
long endTime2 = System.nanoTime();
double estimatedTime2 = (endTime2 - startTime2)/1000000.0;
System.out.println(estimatedTime2 + " milliseconds");
输出:
2.5015 milliseconds
我哪一部分做错了?线程应该更快。
一个典型的新手误解:使用多线程并不一定会导致更快的执行!
线程归根结底是由底层操作系统管理的。因此,创建这样的线程会带来一定的开销!因此,只有当相应的 "tasks" 具有一定的持续时间时,使用多线程才有意义。除此之外,您还需要一个 CPU 能够 运行 所有线程并行,否则您将再次失去使用单个线程进行计算工作的机会。
换句话说:在只需要 "relatively few" 毫秒或纳秒即可完成的简单计算上投入多个线程可实现更慢的执行时间!
最后:当您的线程花费大量时间等待某事发生(例如执行文件 io)时,多线程的真正好处就会出现。
因此:当您打算使用一个线程而不是多个线程进行有意义的实验时,您必须在定义设置时纳入此类细节。
我正在尝试更快地计算我的程序。但是使用线程会使它变慢。这是简化的代码:
在这个数组中,尝试对每个数字求和。 例如:个位数=3+6
List<String> myArr = new ArrayList<String>();
myArr.add("123");
myArr.add("456");
当这样计算时:
/* NORMAL USE */
long startTime1 = System.nanoTime();
int units=0; int tens=0; int hundreds=0;
for(int i=0; i < myArr.size(); i++) {
units += Character.getNumericValue(myArr.get(i).charAt(2));
tens += Character.getNumericValue(myArr.get(i).charAt(1));
hundreds += Character.getNumericValue(myArr.get(i).charAt(0));
}
long endTime1 = System.nanoTime();
double estimatedTime1 = (endTime1 - startTime1)/1000000.0;
System.out.println(estimatedTime1 + " milliseconds");
输出:
0.0285 milliseconds
使用线程计算时:
/* USING THREAD */
ExecutorService pool = Executors.newFixedThreadPool(3);
long startTime2 = System.nanoTime();
pool.execute(new UnitsDigit(myArr));
pool.execute(new TensDigit(myArr));
pool.execute(new HundredsDigit(myArr));
pool.shutdown();
long endTime2 = System.nanoTime();
double estimatedTime2 = (endTime2 - startTime2)/1000000.0;
System.out.println(estimatedTime2 + " milliseconds");
输出:
2.5015 milliseconds
我哪一部分做错了?线程应该更快。
一个典型的新手误解:使用多线程并不一定会导致更快的执行!
线程归根结底是由底层操作系统管理的。因此,创建这样的线程会带来一定的开销!因此,只有当相应的 "tasks" 具有一定的持续时间时,使用多线程才有意义。除此之外,您还需要一个 CPU 能够 运行 所有线程并行,否则您将再次失去使用单个线程进行计算工作的机会。
换句话说:在只需要 "relatively few" 毫秒或纳秒即可完成的简单计算上投入多个线程可实现更慢的执行时间!
最后:当您的线程花费大量时间等待某事发生(例如执行文件 io)时,多线程的真正好处就会出现。
因此:当您打算使用一个线程而不是多个线程进行有意义的实验时,您必须在定义设置时纳入此类细节。