Почему язык Java для соревновательного программирования медленнее CPP?

Опубликовано: 16 Мая, 2021

Выбор подходящего языка при запуске соревновательного программирования является наиболее важным фактором. Как правило, мы выбираем тот язык, который имеет короткий синтаксис и выполняется очень быстро или который нам знаком, и мы знаем все рабочие шаблоны этого конкретного языка, будь то Java или C ++.

Большинство программистов используют C ++ для соревновательного программирования, а также многие старые программисты переходят на C ++. Самые популярные конкурентоспособные программисты, такие как Геннадий Короткевич, Эррихто и многие другие программисты, используют C ++ для конкурентного программирования, но почему возможности Java для конкурентного программирования намного меньше, чем по сравнению с C ++? Давай понять это

Программа простого сложения C ++:

Программа простого сложения Java:

Мы видим, что время выполнения и объем памяти C ++ намного меньше, чем у Java-программы. Это очень большая проблема для больших программ.

Есть несколько причин, по которым java медленнее для конкурентного программирования по сравнению с C ++, что заставляет программистов избегать его. Некоторые из наиболее распространенных из них приведены ниже ...

1. Выбор неправильного класса для операций ввода-вывода или использование неверного синтаксиса

Язык Java не очень медленный по сравнению с C ++ . В JAVA обычно используются два класса для операций ввода-вывода: класс сканера и класс BufferedReader. Большинство программистов, особенно новичков, используют класс Scanner для операций ввода-вывода и избегают класса Buffered Reader для ввода-вывода из-за длинного синтаксиса.

Внутренние операции синтаксического анализа в классе сканера делают выполнение программы очень медленным, тогда как класс Buffered Reader только читает ввод, а дальнейший синтаксический анализ выполняется в соответствии с потребностями операций. Использование класса Scanner создает задачу TLE для Java-программ в соревновательном программировании.

Было опубликовано много статей о том, как избежать TLE в Java, например, «Как избавиться от проблемы Java TLE» и «Как работает онлайн-судья и как избежать проблемы с превышением временного лимита»? Вкратце, во всех статьях предлагается использовать класс Buffered Reader вместо класса Scanner для операций ввода-вывода.

Ява






import java.io.*;
import java.util.*;
class GFG {
public static void main(String[] args) throws NumberFormatException, IOException {
// Reading the input and performing internal parsing
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
// Reading the input as a Stream Using InputStreamReader
BufferedReader Bd = new BufferedReader( new InputStreamReader(System.in));
// converting the String into int datatype
int m = Integer.parseInt(Bd.readLine());
}
}

Подробнее об этой теме читайте в статье Как создавать фрагменты Java в VSCode для соревновательного программирования? и если вы хотите узнать, как уменьшить скорость выполнения для языка Java, прочтите статью «Быстрый ввод-вывод в Java в конкурентном программировании».

Язык C ++ также быстр, потому что он очень близок к машине и регистрам. По этой причине C ++ также используется во встроенных схемах, а не в Java.

2 . Процесс компиляции и исполнения

Языки программирования можно различать на основе процесса выполнения и компиляции программы. Некоторые языки являются интерпретируемыми языками, что означает, что интерпретатор построчно проверяет синтаксис определенного интерпретируемого языка, такого как Python.

Скомпилированные языки напрямую преобразуют программы в машинный код. В результате эти языки намного быстрее, чем язык переводчика. Интерпретатору требуется очень мало времени для анализа исходного кода. Однако общее время выполнения процесса намного меньше. Это делает выполнение интерпретируемого языка программирования очень медленным по сравнению с компилируемыми языками, такими как C или C ++. Вот почему Python медленнее, чем C ++ и Java.

Java не является ни компилируемым, ни интерпретируемым языком. Он находится посередине. Java - это платформенно-независимый язык, что делает его очень популярным среди всех языков программирования. Байт-код делает его независимым от платформы языком. В этом преимущество Java.

Это делает выполнение программ медленнее, чем программа на C ++, потому что нет промежуточных операций, которые выполняются для выполнения и компиляции, как Java в C ++. Причина медленного выполнения программы заключается в огромных накладных расходах на запуск кода Java, если виртуальная машина не запущена.

Процесс компиляции и выполнения программы JAVA:

3. Потребление памяти

Программы на Java потребляют больше памяти, чем программа на C ++. (См. Указанные выше программы на Java и C ++).

Все мы знаем, что Java сама управляет памятью и не требует явного вмешательства программиста. Сам сборщик мусора обеспечивает очистку неиспользуемого пространства и освобождение памяти, когда она не нужна. Таким образом, дополнительный сборщик мусора требует дополнительной памяти для отслеживания всего потребления памяти java-программой.

Программисту java выгодно не заботиться об управлении памятью. Это автоматически выполняется JVM и сборщиком мусора, но сборщик мусора отсутствует в C ++. Есть вероятность утечки памяти, но это делает программы на C ++ очень легкими.

Следовательно, программы на C ++ потребляют меньше памяти, чем программы на Java. В результате это помогает в быстром выполнении программ на C ++.

  “If your weapon is sharp your chance to win the game increases”

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