Out of curiosity, arising from a discussion on the Raspberry Pi forum, I did some micro benchmarking of C, Java and Python programming languages on Raspberry Pi. The application loops through numbers from 3 to 10000 and checks whether it is a prime number. I tried my best to make the code as close the same in all three languages (even not using boolean types) and eliminate any interference like console output. Also I did repeat the tests multiple times; seeing only some milliseconds deviation between runs.
Python code:
Saved as prime2.py and ran timing the execution:
...yes, that is 8 and a half minutes.
result = 0 result |= 2 for i in range(3,10001): prime = 1 for j in range(2, i): k = i/j l = k*j if l == i: prime = 0 if prime == 1: result |= i print result
$ time python prime2.py 16383 real 8m25.081s user 8m7.960s sys 0m1.230s $ python --version Python 2.7.3
C code (repeats the test function 10 times to match Java...):
Saved as prime2.c, compiled with gcc -O2 -o prime2 prime2.c (with typical optimisation level 2) and ran:
...which is 36 seconds for 10 rounds = less than 4 seconds for the same one round as in Python... (gcc (Debian 4.6.3-14+rpi1) 4.6.3)
#include <stdio.h> int test() { int result = 0; result |= 2; int i; for (i=3;i<=10000;i++) { int prime = 1; int j; for (j=2;j<i;j++) { int k = i/j; int l = k*j; if (l==i) prime = 0; } if (prime) result |= i; } printf("%i\n", result); } int main() { int i; for (i = 0; i < 10; i++) { test(); } }
$ time ./prime2 16383 16383 16383 16383 16383 16383 16383 16383 16383 16383 real 0m35.957s user 0m35.780s sys 0m0.070s $ gcc --version gcc (Debian 4.6.3-14+rpi1) 4.6.3
Java code (repeats the test function 10 times to eliminate the effect of virtual machine start up time and possibly give the Hotspot compiler a chance to kick in):
Saved as Prime2.java, compiled with javac Prime2.java and ran:
...which is pretty impressive - even slightly faster than C - the Oracle guys have done a good job with optimising the Java platform for RPi.
public class Prime2 { public static void main(String [] args) { for (int i = 0; i < 10; i++) { test(); } } public static void test() { int result = 0; result |= 2; for (int i=3;i<=10000;i++) { boolean prime = true; for (int j=2;j<i;j++) { int k = i/j; int l = k*j; if (l==i) prime = false; } if (prime) result |= i; } System.out.println(result); } }
$ time java Prime2 16383 16383 16383 16383 16383 16383 16383 16383 16383 16383 real 0m33.490s user 0m33.130s sys 0m0.240s $ java -version java version "1.8.0-ea" Java(TM) SE Runtime Environment (build 1.8.0-ea-b36e) Java HotSpot(TM) Client VM (build 25.0-b04, mixed mode)
Of course this is just a micro benchmark and one cannot draw too definite conclusions from the results. Also there are other aspects (accessibility, productivity, availability of domain specific libraries etc.) to consider when choosing a programming language.
No comments:
Post a Comment
Note: only a member of this blog may post a comment.