这个程序是用给定的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);
}
}
}
答案 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使这对于简单程序来说非常简单。