Низкая производительность API перевода Google в Списке. Как улучшить? - PullRequest
0 голосов
/ 26 апреля 2018

Я использую API Google Translate для перевода списка строк, в данном случае - конфет и их соответствующих цветов. У меня нет проблем с переводом, однако время обработки очень медленное - где-то около 20 секунд. Я ищу, чтобы улучшить скорость этого. Любые предложения приветствуются, спасибо. Мой код ниже:

Это из сервисного уровня моего приложения Spring. После обработки я передаю List<String> своему уровню контроллера в моей службе REST.

Набор данных, который я обрабатываю, содержит около 100 элементов.

public List<String> getSortedCandies() {
    List<Candy> candyList = new ArrayList<>(this.candyList);

    //sort candies
    candyList = candyList.stream()
            .sorted((o1, o2) -> {
                int nameResult = o1.getName().toUpperCase().compareTo(o2.getName().toUpperCase());
                if (nameResult == 0) {
                    return o1.getColor().toUpperCase().compareTo(o2.getColor().toUpperCase());
                }
                return nameResult;
            }).collect(Collectors.toList());

    Translate translate = TranslateOptions.getDefaultInstance().getService();

    List<String> translatedList = new ArrayList<>();

    //translate from english to spanish
    for (Candy candy : candyList) {
        Detection detection = translate.detect(candy.toString());
        String detectedLanguage = detection.getLanguage();
        Translation translation = translate.translate(
                candy.toString(),
                Translate.TranslateOption.sourceLanguage(detectedLanguage),
                Translate.TranslateOption.targetLanguage("es")
        );
        translatedList.add(translation.getTranslatedText());
    }

    return translatedList;
}

1 Ответ

0 голосов
/ 06 мая 2018

Вы можете изменить свой код для использования parallelStream() и Collections.synchronizedList():

public class StackOverflowSample {

    private List<Candy> candyList = new ArrayList<>();

    public StackOverflowSample() {

    }

    public StackOverflowSample(List<Candy> candyList) {
        this.candyList = candyList;
    }

    public List<String> getSortedCandies() {

        // sort candies
        candyList = candyList.stream().sorted((o1, o2) -> {
            int nameResult = o1.getName().toUpperCase().compareTo(o2.getName().toUpperCase());
            if (nameResult == 0) {
                return o1.getColor().toUpperCase().compareTo(o2.getColor().toUpperCase());
            }
            return nameResult;
        }).collect(Collectors.toList());

        Translate translate = TranslateOptions.getDefaultInstance().getService();

        List<String> translatedList = Collections.synchronizedList(new LinkedList<>());

        candyList.parallelStream().forEach(c -> {
            Detection detection = translate.detect(c.toString());
            String detectedLanguage = detection.getLanguage();
            Translation translation = translate.translate(c.toString(),
                    Translate.TranslateOption.sourceLanguage(detectedLanguage),
                    Translate.TranslateOption.targetLanguage("es"));
            translatedList.add(translation.getTranslatedText());
        });

        return translatedList;
    }
}

Я проверил код, но, возможно, вы могли бы сравнить текущее время до и после процесса, как рекомендовано в этом ответе:

https://stackoverflow.com/a/1770475/9015852

...