📜  为什么Java语言在竞争性编程中比 CPP 慢?

📅  最后修改于: 2021-10-22 03:05:16             🧑  作者: Mango

在开始竞争性编程时选择合适的语言是最重要的因素。通常,我们选择语法短且执行速度非常快的语言或我们熟悉的语言,并且我们知道该特定语言的所有工作模式,无论是Java还是 C++。

为什么 Java 语言比 CPP 慢于竞争性编程

大多数程序员使用 C++ 进行竞争性编程,也有许多老程序员转向 C++。最受好评的竞争程序员,如 Gennady Korotkevich、Errichto 和许多其他程序员使用 C++ 进行竞争性编程,但为什么Java进行竞争性编程的句柄比 C++ 少得多?让我们明白这一点

C++简单加法程序:

Java简单加法程序:

我们可以看到C++的执行时间和Memory比Java程序小很多。这对大程序来说是一个非常大的问题。

与 C++ 相比, Java在竞争性编程中速度较慢的原因有很多,这让程序员避免使用它。下面给出了一些常见的……

1. 为 I/O 操作选择错误的类或使用错误的语法

与 C++ 相比, Java语言并不是很慢 Java一般用于I/O操作的类有两个,Scanner类和BufferedReader类。大多数程序员,尤其是初学者,使用 Scanner 类进行 I/O 操作,避免使用 Buffered Reader 类进行 I/O,因为语法很长。

扫描器类中的内部解析操作使程序的执行速度非常慢,而缓冲读取器类只读取输入,并根据操作的需要进行进一步的解析。使用 Scanner 类为竞争性编程中的Java程序创建 TLE 问题。

已经发表了很多关于如何避免Java的TLE 的文章,即“如何摆脱Java TLE 问题”和如何在线判断工作以及如何避免时间限制超出问题?等等。简而言之,所有文章都建议使用 Buffered Reader 类而不是 Scanner 类进行 I/O 操作。

Java
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());
    }
}


从文章如何在 VSCode 中为竞争性编程创建Java片段?如果您想知道如何降低Java语言的执行速度,请阅读竞争性编程中的Java中的快速 I/O 一文。

C++ 语言也很快,因为它非常接近机器和寄存器。这就是 C++ 也用于嵌入式电路而不是Java。

2 .编译执行过程

编程语言可以根据其程序的执行和编译过程进行区分。某些语言是解释性语言意味着解释器会逐行检查特定解释性语言(如Python)的语法。

编译语言直接将程序转换成机器码。因此,这些语言比解释器语言快得多。解释器花费很少的时间来分析源代码。但是,执行该过程的总时间要慢得多。与 C 或 C++ 等编译语言相比,这使得解释型编程语言的执行速度非常慢。这就是Python比 C++ 和Java慢的原因。

Java既不是编译型语言,也不是解释型语言。它位于中间。 Java是一种独立于平台的语言,这使得它在所有编程语言中都非常流行。字节码使它成为一种平台无关的语言。这就是Java的优势。

它使得程序的执行速度比 C++ 程序慢,因为在 C++ 中没有像Java那样的执行和编译发生的中间操作。程序执行缓慢的原因,如果虚拟机没有运行,启动Java代码会有巨大的开销。

Java程序编译执行过程:

3.内存消耗

Java程序的内存消耗大于 C++ 程序。 (参考以上Java和C++程序)。

我们都知道Java自己管理内存,不需要程序员的显式干预。垃圾收集器本身确保未使用的空间得到清理,并且在不需要时可以释放内存。所以额外的垃圾收集器需要额外的内存来跟踪Java程序的所有内存消耗。

Java程序员不关心内存管理是有益的。它由 JVM 和垃圾收集器自动完成,但垃圾收集器在 C++ 中不存在。存在内存泄漏的可能性,但它使 C++ 程序非常轻巧。

因此,与Java程序相比,C++ 程序的内存消耗非常少。因此它有助于C++ 程序快速执行。

我们可以选择任何语言进行竞争性编程,但首先,我们必须清除其所有基本主题以及特定语言的工作原理,这对初学者非常有益。