📜  为什么Java语言比CPP竞争编程要慢?

📅  最后修改于: 2021-05-30 05:11:51             🧑  作者: Mango

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

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

大多数程序员使用C++进行竞争性编程,也有许多老程序员转而使用C++。像Gennady Korotkevich,Errichto这样的最受好评的竞争性程序员,以及许多其他程序员都使用C++进行竞争性编程,但是为什么竞争性编程Java语言比C++少得多?让我们了解一下

C++简单加法程序:

Java简单加法程序:

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

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

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

与C++相比, Java语言不是很慢 Java通常有两个用于I / O操作的类:Scanner类和BufferedReader类。大多数程序员,特别是初学者,都使用Scanner类进行I / O操作,并且由于语法长而避免使用Buffered Reader类进行I / O。

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

关于如何避免Java的TLE的文章已经发表了很多,例如“如何摆脱Java TLE问题”以及在线法官的工作方式以及如何避免时限超出问题?简而言之,所有文章都建议对I / O操作使用Buffered Reader类而不是Scanner类。

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++的编译语言相比,这使Interpreted编程语言的执行非常慢。这就是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++程序快速执行。

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