Il y avait un sujet ici que Java Scanner était très lent, donc j'ai mesuré sa lenteur, donc je vais le rapporter brièvement.
Comparaison de vitesse de Python, Java, C ++
nombre de données=Un million | Temps d'exécution |
---|---|
Scanner Java | 714 msec |
Propre scanner | 24 msec |
grossissement | 29.75 |
Comparé à notre propre scanner simple, Java Scanner prend environ 30 fois plus de temps. Il semble préférable de ne pas utiliser Sanner dans la programmation compétitive.
Voici le code utilisé pour la comparaison.
import java.util.*;
import java.io.*;
import java.util.stream.*;
public class ScannerTest {
public static void main(String[] args) {
long t0 = System.currentTimeMillis();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] d = new int[n];
for (int i = 0; i < n; i++) {
d[i] = sc.nextInt();
}
long t1 = System.currentTimeMillis();
System.out.println("n = " + n );
System.out.println((t1-t0) + " msec");
int sum = IntStream.of(d).sum();
System.out.println("sum = " + sum);
}
}
import java.util.*;
import java.io.*;
import java.util.stream.*;
public class ScannerTest3 {
static class MyScanner {
byte[] bytes;
int pos = 0;
int len;
InputStream inputStream;
MyScanner(InputStream is){
try{
inputStream = is;
bytes = new byte[1024];
len = Math.max(0,inputStream.read(bytes));
pos = 0;
return;
}catch(Exception e){
e.printStackTrace();
}
}
private byte getNextByte() throws IOException {//throws ArrayIndexOutOfBoundsException
if( pos >= len ){
len = Math.max(0,inputStream.read(bytes));
pos = 0;
}
byte result = bytes[pos++];
return result;
}
int nextInt() throws IOException {
int result = 0;
byte v;
while(true){
v = getNextByte();
if( v != ' ' && v != '\n' && v != '\r'){
break;
}
}
while(true){
if( v == ' ' || v == '\n' || v == '\r' ){
break;
}
result *= 10;
result += (int)v - (int)'0';
v = getNextByte();
}
return result;
}
}
public static void main(String[] args) throws Exception{
long t0 = System.currentTimeMillis();
MyScanner sc = new MyScanner(System.in);
int n = sc.nextInt();
int[] d = new int[n];
for (int i = 0; i < n; i++) {
d[i] = sc.nextInt();
}
long t1 = System.currentTimeMillis();
System.out.println("n = " + n );
System.out.println((t1-t0) + " msec");
int sum = IntStream.of(d).sum();
System.out.println("sum = " + sum);
}
}
Recommended Posts