簡體   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