繁体   English   中英

所有Java线程都在单个内核上运行,最终花费太多时间来执行

[英]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%的信用:(这是我的代码和测试用例。

矩阵乘法.zip

当我遇到我的教授有关我的成绩时。 他告诉我,我的代码执行太长的矩阵花费的时间太长。

我与他争辩说,这是一种预期的行为,因为很明显,大数据需要花费更多时间。 但是,他不同意我的看法。

我附上了我的代码和测试用例。 我的代码需要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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM