Как получить лучшую производительность с помощью следующего кода - PullRequest
0 голосов
/ 27 марта 2019

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

С чего начать и что я могу сделать?

Следующий код просматривает строку, пытаясь найти подстроки, которые вводятся вручную.

Первая строка запрашивает строку. Вторая строка запрашивает количество строк, которые вы попытаетесь найти, затем вы вводите строки, которые вы ищете, которые не длиннее 4 и не короче 1.

В выводе вы получите, сколько раз подстрока была в строке.

    BufferedReader br;
    br = new BufferedReader(new InputStreamReader(System.in));
    String getLine = br.readLine();

    if (getLine.length() < 1 || getLine.length() > 1000000) {
        getLine = br.readLine();
    }

    getLine = getLine.toUpperCase();

    String helpNumber = br.readLine();
    int number = Integer.parseInt(helpNumber);

    if(number < 1 || number > 100000){
        helpNumber = br.readLine();
        number = Integer.parseInt(helpNumber);
    }

    String[] shortCuts = new String[number];

    for (int i = 0; i < number; i++) {
        shortCuts[i] = br.readLine();
        if(shortCuts[i].length()>=1 && shortCuts[i].length()<=4) {
            shortCuts[i] = shortCuts[i];
            shortCuts[i] = shortCuts[i].toUpperCase();
        }else i--;
    }

    for (int i = 0; i < number; i++) {
        System.out.println(count(getLine, shortCuts[i]));
    }

}

private static int count(final String string, final String substring) {
    int count = 0;
    int index = 0;

    while ((index = string.indexOf(substring, index)) != -1) {
        index++;
        count++;
    }

    return count;
}

Я хочу, чтобы этот код работал быстрее.

1 Ответ

0 голосов
/ 27 марта 2019

Предполагая, что «медленной» частью кода является подсчет подстроки в строке, вызванной здесь

 for (int i = 0; i < number; i++) {
        System.out.println(count(getLine, shortCuts[i]));
    }

Мысль ускорить следующую операцию

private static int count(final String string, final String substring)

- вызвать его в число логических процессоров в вашей системе.Вам нужно будет понять и прочитать о CompletableFuture

Следовательно, вы сможете разбить массив shortcuts size n на разделы в зависимости от логического процессора в вашемmachine Runtime.getRuntime().availableProcessors(); Объедините результат в конце и вернитесь, когда весь поток достигнет завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...