Is it possible that Java is faster than CPP? Why?
this is an algorithm for calculating palindromes less than 100,000 primes written with CPP .
-sharpinclude <iostream>
using namespace std;
int main()
{
int input_num=100000;
int pp_count=0;
for(int each=2; each<=input_num; eachPP)
{
int factorization_lst=0;
for(int factor=1; factor<=each; factorPP)
if(each%factor==0&&!(factor>each/factor))
factorization_lstPP;
if(factorization_lst==1)
{
int antitone=0,each_cpy=each;
while(each_cpy)
{
antitone=antitone*10+each_cpy%10;
each_cpy/=10;
}
if(antitone==each)
{
pp_countPP;
cout<<pp_count<<":"<<each<<endl;
}
}
}
return 0;
}
A slightly modified version of Java , with the addition of timing related parts.
public class main {
public static void main(String[] args) {
long start = System.currentTimeMillis();
int input_num = 100000;
int pp_count = 0;
for (int each = 2; each <= input_num; eachPP) {
int factorization_lst = 0;
for (int factor = 1; factor <= each; factorPP)
if (each % factor == 0 && !(factor > each / factor))
factorization_lstPP;
if (factorization_lst == 1) {
int antitone = 0, each_cpy = each;
while (each_cpy != 0) {
antitone = antitone * 10 + each_cpy % 10;
each_cpy /= 10;
}
if (antitone == each) {
pp_countPP;
System.out.println(pp_count + ":" + each);
}
}
}
System.out.println(System.currentTimeMillis() - start);
}
}
execution result:
CPP230sJava124sCPP
:3Braspbian(java17s)CPPJavacodeblockseclipse(eclipse20123.8.1codeblocks201616.01)gcc-O2mainJavaJava
:
@Untitled(sf)JIT
JavaIDEIO
(shellCPP)
JIT
Java(797110)
JIT(1,2)JVMJavaCPP
JavaJIT
:
x86/x64
WindowsLinuxCPPJavaarm
Android7(6304GBAndroid 8.0root)IDE(Linux Deploy):ide.com/" rel="nofollow noreferrer">AIDE (Java)ide" rel="nofollow noreferrer">CIDE (CPPaarch64gcc7.2)
CIDECPP
-O3(-Os)
:()
CPP43s
Java37s
.....
()
:
Untitledclang
(Raspbianapt install clang
)
(Java)
:3m22s(202s)
-O2:3m05s(185s)(-O3-O2)
java
time
...
:
Android()
(CPPJava)
:
MainActivity.java
Java.java
native-lib.cpp
:
:
:
:android.os.Build
MODEL |
MANUFACTURER |
DISPLAY |
SDK_INT |
Java |
CPP |
GT-I9300 |
samsung |
lineage_i9300-userdebug 7.1.2 NJH47F 0f9e26b899 |
25 |
192169 |
171928 |
|
Redmi 4A |
Xiaomi |
NJH47F |
25 |
66009 |
31907 |
|
m2 |
Meizu |
Flyme 6.3.0.0A |
22 |
37722 |
34654 |
|
A2 |
softwinner |
2G |
19 |
239865 |
202402 |
|
Redmi Note 3 |
Xiaomi |
OPM1.171019.018 |
27 |
22299 |
18105 |
|
TA-1041 |
HMD Global |
00CN_1_34E |
26 |
37310 |
20234 |
|
HTC 802t |
htc |
LRX22G release-keys |
21 |
48211 |
125279 |
|
arm AndroidCPPJava
the CPU of this device is Snapdragon 600. < del > (how strange.) < / del >
another: I bought a orange pie zero plus
two days ago, using Quan Zhi H5
. CPP 45s
, java 70s
.
all my arm devices have been tested. Can I come to the following conclusion?
in a small number of arm instruction set architecture devices, Java runs faster than CPP.
want to know why.
I ran the code you gave me on the old school server. Cpp uses the time
that comes with the system, and java uses the program's own result. The result is cpp's 25.125s user time, 25.130s wall clock time; java 25.240s user time, 25.250s wall clock time, self-proclaimed 25114 In order to eliminate the influence of the I _ cpp O operation, I commented out all the output of cpp and java except the last sentence of the java version, and tried again, and the result was pretty much the same. So I'm going to change 100, 000 to 1 million. I haven't finished running yet. I'll put the results up again when I'm free < del > ha < / del >
.
the above are very temporary and imprecise experimental results, so there is no time to do a large number of control experiments. I think that in some cases, the reason why java programs with identical code logic are faster than cpp programs or c programs should be the difference between compiler optimization and the implementation of individual operations, but I can't think of any other reason for the time being. No matter what language the program is written, the actual "running" must be the machine instruction, the body part compiled by cpp and c is a bunch of machine instruction sequence, and the java compiled is the machine instruction sequence of jvm (right? ), but you have to jvm to interpret the bytecode when executing, and you still have to execute the host machine instructions when the explanation is executed, but there seems to be a saying of JIT
? (not very familiar with java). So I believe that theoretically speaking, without using JIT
, java is definitely not as fast as cpp and c (in the sense of "the same program", but this "same" is very difficult to define, as long as you understand it), because java still has to "explain" before it can be "executed". So I think it must be the compiler's pot, but I just feel that I don't have any experimental results.
can you try to turn off JIT
and compare the results?
if you are interested, you can try different programs, simple, complex, and compare multiple programs (remember that java automatically skips some meaningless loops, such as idling loops, which should be noted). Among them, the simple program can disassemble the compiled files, analyze the theoretical execution efficiency, and find out the reasons for the differences.
< hr >
tried to run on raspberry pie 3B, and it turned out to be much slower than the main question, but java was indeed faster than cpp. Using the same code as the landlord, cpp ran for more than 4 minutes, and java ran for nearly 2 minutes of, quite interesting: D. Both cpp and java use the default compilation parameters, and the gPP version is 4.9.2, and the javac version is 1.8.0, the java version is 65, and the java version is 1.8.0_65-b17.
then I added the -O2
parameter to the cpp version, and the time was increased to more than 3 minutes and 40 seconds-- still not as fast as the java version of emmmmm
.
this is more amazing, so I tried another program-- I wrote a Fibonacci sequence evaluation myself-- which is comfortable this time. Cpp 1.6sMagna 3.4s, < del > more details later, first sweep the grave < / del > the following is the test code
< H2 > Recursive Fibonacci sequence < / H2 >
Test code
// test.cc
-sharpinclude <iostream>
using namespace std;
int fibo(int n)
{
switch(n)
{
case 1: return 1;
case 2: return 1;
default: return fibo(n - 1) + fibo(n - 2);
}
}
int main()
{
cout << fibo(40) << endl;
return 0;
}
// main.java
public class main {
private static int fibo(int n) {
switch(n) {
case 1: return 1;
case 2: return 1;
default: return fibo(n - 1) + fibo(n - 2);
}
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
System.out.println(fibo(40));
System.out.println(System.currentTimeMillis() - start);
}
}
// Makefile
main: test.cc main.java
gPP test.cc -o test -O2
javac main.java
I don't know anything. I liked it when I saw GGWP.