如何让这个java程序在多核中运行?

时间:2016-11-10 19:40:33

标签: java multithreading parallel-processing multiprocessing core

这个程序是用给定的set从给定的char序列生成所有可能的字符串但是需要很长时间, 那我怎么能在多CPU中运行呢?

public class LapTest {

static int q=0;

public static void main(String[] args) {
  System.out.println("First Test");
    char set1[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
    int k = 4;
    printAllKLength(set1, k);

      System.out.println(q);
}    

// The method that prints all possible strings of length k.  It is
//  mainly a wrapper over recursive function printAllKLengthRec()
static void printAllKLength(char set[], int k) {
    int n = set.length;        
    printAllKLengthRec(set, "", n, k);
}

// The main recursive method to print all possible strings of length k
static void printAllKLengthRec(char set[], String prefix, int n, int k) {

    // Base case: k is 0, print prefix
    if (k == 0) { q++;
        System.out.println(prefix);

        if (prefix.equals("hkka")) {
           System.exit(0);
        }
        return;
    }

    // One by one add all characters from set and recursively 
    // call for k equals to k-1
    for (int i = 0; i < n; ++i) {

        // Next character of input added
        String newPrefix = prefix + set[i]; 

        // k is decreased, because we have added a new character
        printAllKLengthRec(set, newPrefix, n, k - 1); 
    }
}
}

2 个答案:

答案 0 :(得分:1)

您的程序非常可能 I / O绑定,这意味着将输出写入屏幕将比计算字符串花费更多时间。因此并行处理对您没有任何帮助。无论你以后如何处理字符串,在现代计算机上,即使使用不完美的解决方案,接收器(字符串的消费者)也很可能比计算它更慢。

另外,对于将字符串写入屏幕,请使用缓冲编写器,这将使您的程序更快。在类中定义BufferedOutputStream:

static BufferedOutputStream out = new BufferedOutputStream(System.out, 81920); 

然后使用out.write((prefix+"\n").getBytes());进行写信,不要忘记在程序末尾和out.flush();上使用System.exit(0);刷新流。这将为您带来显着的性能提升。

也试着在没有递归的情况下解决问题,这可能会给你另一个速度泵。

答案 1 :(得分:0)

在尝试使其成为多线程之前,您应该进行许多性能改进。我可以看到你可以做的几件明显的事情来提高性能。但经验表明,大多数编码人员(包括我自己)都在猜测应该调整代码的位置以使其更有效率。

所以我的建议是学习使用分析器。分析您的代码并找出它在cpu周期中花费的位置,然后在正确的位置调整代码。学习这样做会得到更好的结果。良好的现代IDE使这对于简单程序来说非常简单。