[英]All java threads are running on a single core, ultimately taking too much time to execute
这是我的作业问题:我必须做矩阵乘法。 我的代码应为结果矩阵中的每个元素创建一个线程。 也就是说,如果结果矩阵的大小为mXn,则应该有m * n个线程。
( http://iit.qau.edu.pk/books/OS_8th_Edition.pdf第179页)
是的,我自己完成了。 我所有的测试用例都执行得很好。 不幸的是,我最终获得了70%的信用:(这是我的代码和测试用例。
当我遇到我的教授有关我的成绩时。 他告诉我,我的代码执行太长的矩阵花费的时间太长。
我与他争辩说,这是一种预期的行为,因为很明显,大数据需要花费更多时间。 但是,他不同意我的看法。
我附上了我的代码和测试用例。 我的代码需要3个小时。 根据我的教授,只需5分钟即可执行。
我试图找出最近几天,但找不到确切的解决方案:(
我的代码大纲
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
}
运行方法:
public void run() {
for (int k = 0; k < m1ColLength; k++) { // columns from m1
Matrix.mResult[i][j] += matrix1[i][k] * matrix2[k][j];
}
提前致谢
好的,我下载了您的zip并运行了该程序。 您的问题根本不在矩阵乘法中。 注释中的建议在减少线程数方面仍然有效,但是因为这样一来乘法就非常快。
实际的问题出在您的writeToAFile
方法中-乘法完成后,您看到的所有单线程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();
该代码在不到一秒钟的时间内执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.