[英]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.