所有java线程都在一个内核上运行,最终会花费太多的时间来执行
这是我的家庭作业问题: 我必须做矩阵乘法。我的代码应该为结果矩阵中的每个元素创建一个线程。i、 例如,如果生成的矩阵是mXn大小,那么应该有m*n个线程 (第179页) 是的,我自己完成了。这在我所有的测试用例中都执行得很好。不幸的是,我最终得到了70%的积分:( 这是我的代码和测试用例 当我和我的教授讨论我的分数时,他告诉我,我的代码太长,无法执行更大的矩阵 我和他争辩说,这是一种预期行为,因为大数据显然需要更多的时间。然而,他不同意我的观点 我附上了我的代码和测试用例。我的代码需要3个小时。根据我的教授,执行只需要5分钟 在过去的几天里,我一直在想办法,但找不到确切的解决办法:( 我的代码概要所有java线程都在一个内核上运行,最终会花费太多的时间来执行,java,multithreading,synchronization,cpu-usage,Java,Multithreading,Synchronization,Cpu Usage,这是我的家庭作业问题: 我必须做矩阵乘法。我的代码应该为结果矩阵中的每个元素创建一个线程。i、 例如,如果生成的矩阵是mXn大小,那么应该有m*n个线程 (第179页) 是的,我自己完成了。这在我所有的测试用例中都执行得很好。不幸的是,我最终得到了70%的积分:( 这是我的代码和测试用例 当我和我的教授讨论我的分数时,他告诉我,我的代码太长,无法执行更大的矩阵 我和他争辩说,这是一种预期行为,因为大数据显然需要更多的时间。然而,他不同意我的观点 我附上了我的代码和测试用例。我的代码需要3个小时
ExecutorService executor = Executors
.newFixedThreadPool(threadCount); // creating thread pool
// with fixed threads
int mRRowLen = matrix1.length; // m result rows length
int mRColLen = matrix2[0].length; // m result columns length
mResult = new long[mRRowLen][mRColLen];
for (int i = 0; i < mRRowLen; i++) { // rows from m1
for (int j = 0; j < mRColLen; j++) { // columns from m2
Runnable r = new MatrixMultipliactionThread(matrix1ColLen, i, j, matrix1,
matrix2);
executor.execute(r);
}
}
executor.shutdown();
while (!executor.isTerminated()) {
// wait untill it get shutdown
}
executor服务executor=执行者
.newFixedThreadPool(threadCount);//创建线程池
//螺纹固定
int mRRowLen=matrix1.length;//m结果行长度
int mRColLen=matrix2[0]。长度;//m结果列长度
mResult=新长[mRRowLen][mrcolen];
对于(int i=0;i
运行方法:
public void run() {
for (int k = 0; k < m1ColLength; k++) { // columns from m1
Matrix.mResult[i][j] += matrix1[i][k] * matrix2[k][j];
}
public void run(){
对于(int k=0;k
提前感谢好的,我下载了你的zip并运行了程序。你的问题根本不在于矩阵乘法。注释中关于减少线程数的建议仍然有效,但目前乘法发生得很快 实际的问题在于
writetaffile
方法——在乘法已经完成之后,您看到的所有单线程CPU利用率实际上都发生在那里
添加字符串的方式:
fileOutputString = fileOutputString + resultMatrix[i][j]
创建数千个新的String
对象,然后这些对象立即变成垃圾;这是非常低效的。您应该使用StringBuilder
来代替,如下所示:
StringBuilder sb=new StringBuilder();
for (int i = 0; i < resultMatrix.length; i++) {
for (int j = 0; j < resultMatrix[i].length; j++) {
sb.append(resultMatrix[i][j]);
if (j != resultMatrix[i].length - 1) sb.append(",");
}
sb.append("\n");
}
String fileOutputString=sb.toString();
StringBuilder sb=新建StringBuilder();
对于(int i=0;i
该代码在几分之一秒内执行。我不打算下载一个zip文件并扔掉整个代码。将您认为重要的代码片段张贴在此处。如果生成的矩阵是mXn矩阵,则会有mXn线程:这根本不是一个好主意。您的机器的内核比这少得多,创建这么多线程会带来很多麻烦使用大量CPU和内存来执行一个微小的操作。如果使用单个线程,乘法运算可能会快得多。如果将任务划分为线程,那么线程的数量应该与机器上的内核数量一样多。并且推测
threadCount
不是1
?您的紧密循环f而(!executor.isTerminated()){}
不会有任何帮助…请注意,如果您的代码执行速度是好的解决方案的36倍,那么这不太可能完全是由于线程问题,除非5分钟的版本是在一台怪物机器(或多台机器)上执行的