Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使这个java程序在多核环境下运行?_Java_Multithreading_Memory Management_Parallel Processing_Multiprocessing - Fatal编程技术网

如何使这个java程序在多核环境下运行?

如何使这个java程序在多核环境下运行?,java,multithreading,memory-management,parallel-processing,multiprocessing,Java,Multithreading,Memory Management,Parallel Processing,Multiprocessing,这个程序是从给定的字符序列和给定的集合生成所有可能的字符串,但是它需要很多时间,如何减少内存使用并加速这个prodram在多任务中工作,而不生成两次相同的字符串 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

这个程序是从给定的字符序列和给定的集合生成所有可能的字符串,但是它需要很多时间,如何减少内存使用并加速这个prodram在多任务中工作,而不生成两次相同的字符串

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);

      //Do some logic
}    

// 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); 
    }
}
}
公共类测试{
静态int q=0;
公共静态void main(字符串[]args){
System.out.println(“第一次测试”);
字符集1[]={'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;
打印所有长度(设置1,k);
//做些逻辑分析
}    
//打印长度为k的所有可能字符串的方法。它是
//主要是递归函数printallklengtrec()上的包装器
静态void printAllKLength(字符集[],int k){
int n=设置长度;
printallklengtrec(set,“”,n,k);
}
//打印长度为k的所有可能字符串的主要递归方法
静态void printallklengtrec(字符集[],字符串前缀,int n,int k){
//基本情况:k为0,打印前缀
如果(k==0){q++;
System.out.println(前缀);
if(前缀等于(“hkka”)){
系统出口(0);
}
返回;
}
//一个接一个地从集合中递归添加所有字符
//要求k等于k-1
对于(int i=0;i
您的程序很可能是I/O绑定的,这意味着将输出写入屏幕将比计算字符串花费更多的时间。因此,并行处理对您没有任何帮助。无论您稍后如何处理字符串,在现代计算机上,接收器(字符串的使用者)很可能比计算它慢,即使使用不完美的解决方案也是如此

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

static BufferedOutputStream out = new BufferedOutputStream(System.out, 81920); 
然后使用
out.write((前缀+“\n”).getBytes()进行写入
并且不要忘记使用
out.flush()刷新流系统上的code>退出(0)。这将给您带来显著的性能改进


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

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

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

static BufferedOutputStream out = new BufferedOutputStream(System.out, 81920); 
然后使用
out.write((前缀+“\n”).getBytes()进行写入
并且不要忘记使用
out.flush()刷新流系统上的code>退出(0)。这将给您带来显著的性能改进


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

在尝试实现多线程之前,您应该进行许多性能改进。我可以看到您可以采取一些明显的措施来提高性能。但经验表明,大多数程序员(包括我自己)在猜测应该在哪里调整代码以提高效率方面都很糟糕


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

在尝试实现多线程之前,您应该进行许多性能改进。我可以看到您可以采取一些明显的措施来提高性能。但经验表明,大多数程序员(包括我自己)在猜测应该在哪里调整代码以提高效率方面都很糟糕


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

考虑使用一个。有一个问题你可以解决。多核不会有多大帮助。更好的算法会更好。尝试连接visualvm以查看串接字符串花费了多少时间。更好的算法不会有帮助。假设我想生成一个7长度的字符串,那么它将是8031810176不同的字符串:DConsider,使用。有一个问题你可以解决。多核不会有多大帮助。更好的算法会更好。尝试连接visualvm以查看串接字符串花费了多少时间。更好的算法不会有帮助。假设我想生成一个7长度的字符串,那么它将是8031810176不同的字符串:DI不会在我的最终程序中打印它。我只是打印它,以确保它是工作的,我不会打印在我的最后一个程序。我只是把它打印出来,以确保它是有效的