-1

Эта программа предназначена для генерации всех возможных строк из заданной последовательности символов с заданным набором, но это занимает много времени, , так как я могу запустить ее в нескольких процессорах?Как я могу запустить эту программу java в многоядерном?

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

Рассмотрите возможность использования ['ExecutorService'] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html). Существует [учебник по параллелизму] (http://docs.oracle.com/javase/tutorial/essential/concurrency/), с которым вы можете работать. – bradimus

+0

Multicore не поможет. Лучшие алгоритмы будут. Попробуйте подключить visualvm, чтобы узнать, сколько времени потрачено на конкатенирование строк. –

+0

Лучший алгоритм не поможет. предположим, что я хочу сгенерировать строку длиной 7, тогда это будет 8031810176 другая строка: D –

ответ

1

Ваша программа очень вероятно I/O оценка, это означает, что писать вывод на экран будет принимать более времени, чем вычисление строки. Поэтому параллельная обработка не поможет вам. Независимо от того, что вы делаете со строкой позже, на современном компьютере раковина (потребитель вашей строки), скорее всего, медленнее, чем вычисление, даже с несовершенным решением.

Также для записи строки на экран используйте буферизованный писатель, который сделает вашу программу намного быстрее. Определение BufferedOutputStream в своем классе:

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

Тогда пишите с out.write((prefix+"\n").getBytes()); и не забудьте очистить поток с out.flush(); как на конце программы и на System.exit(0);. Это даст вам значительное улучшение производительности.

Также старайтесь не решать проблему без рекурсии, которая может дать вам еще один насос скорости.

+0

Я не буду печатать ее в своей последней программе. Я только печатаю его, чтобы убедиться, что это работа –

0

Есть много улучшений производительности, которые вы должны сделать, прежде чем пытаться сделать его многопоточным. Я вижу несколько очевидных вещей, которые вы могли бы сделать для повышения производительности. Но опыт показал, что большинство кодировщиков (включая меня) ужасно угадывают, где код должен быть изменен, чтобы сделать его более эффективным.

Итак, мой совет - научиться использовать профилировщик. Профилируйте свой код и узнайте, где он проводит циклы процессора, а затем настройте код в нужных местах. Вы получите гораздо лучшие результаты, чтобы это сделать. Хорошие современные IDE делают этот процесс довольно простым для простых программ.

Смежные вопросы