zxretrosoft wrote:Hi friends,
You might be interested.
I made a simple algorithm, intentionally brute force with CASE.
...
Interesting. I did my own integer-intensive benchmarks a while back. See here:
viewtopic.php?f=17&t=23489
For your test, I get
very different results on my machine: Intel Core i7-6820HQ CPU @2.70GHz, 16 GB ram, Windows 7 64-bit. Plus, it is hard for me to understand how Go, Java and C# are faster than C++, on this benchmark at least.
Please post your Go, Java, C#, C++, Javascript and Python versions. I'd like to test those on my machine.
(
Update: based on what caseih, said, I think I understand better now, why the C++ version might have been so slow. My C versions "cheat", since they use characters, not strings. And since C doesn't have strings, I guess one can't really do this benchmark in C, unless you resort to strcpy() and friends.)
Note: in c, you can't switch on floats, so I did switch ((int)a1), etc., and then a 2nd benchmark using if's, without the cast.
- C using switch and cast: gcc -Ofast: 0.86 seconds
- C using nested ifs, no cast: gcc -Ofast: 1.43 seconds
- QB64 v1.1: qb64 -x: 15.88 seconds
- FB 1.05 32-bit, compiled with: fbc -w all -gen gas -fpu sse -O 3: 16.65 seconds
- FB 1.05 32-bit, compiled with: plain fbc, no options: 16.76 seconds
- FB 1.05 32-bit, compiled with: fbc -w all -gen gcc -fpu sse -Wc -O3: 17.09 seconds
Note that all these print out the same results: L W K 3724 80183725
Very strange that QB64 is a tad bit faster than FreeBasic. First time I've seen that.
For reference, below are my two C versions:
C code using casts and switch:
Code: Select all
#include <stdio.h>
int main() {
double p;
float x=-1;
float a1,a2,a3;
char ps1,ps2,ps3;
char h1,h2,h3;
float h;
p = 0; /* need to init these for C */
a1=a2=a3=h=0; /* need to init these for C */
h1='L';
h2='W';
h3='K';
h=3724;
for (;;) {
x+=1;
p+=1;
if (x>9999) {
x=0;
a3+=1;
if (a3>25) {
a3=0;
a2+=1;
if (a2>25) {
a2=0;
a1+=1;
}
}
}
switch ((int)a1) {
case 0: ps1='A'; break;
case 1: ps1='B'; break;
case 2: ps1='C'; break;
case 3: ps1='D'; break;
case 4: ps1='E'; break;
case 5: ps1='F'; break;
case 6: ps1='G'; break;
case 7: ps1='H'; break;
case 8: ps1='I'; break;
case 9: ps1='J'; break;
case 10: ps1='K'; break;
case 11: ps1='L'; break;
case 12: ps1='M'; break;
case 13: ps1='N'; break;
case 14: ps1='O'; break;
case 15: ps1='P'; break;
case 16: ps1='Q'; break;
case 17: ps1='R'; break;
case 18: ps1='S'; break;
case 19: ps1='T'; break;
case 20: ps1='U'; break;
case 21: ps1='V'; break;
case 22: ps1='W'; break;
case 23: ps1='X'; break;
case 24: ps1='Y'; break;
case 25: ps1='Z'; break;
}
switch ((int)a2) {
case 0: ps2='A'; break;
case 1: ps2='B'; break;
case 2: ps2='C'; break;
case 3: ps2='D'; break;
case 4: ps2='E'; break;
case 5: ps2='F'; break;
case 6: ps2='G'; break;
case 7: ps2='H'; break;
case 8: ps2='I'; break;
case 9: ps2='J'; break;
case 10: ps2='K'; break;
case 11: ps2='L'; break;
case 12: ps2='M'; break;
case 13: ps2='N'; break;
case 14: ps2='O'; break;
case 15: ps2='P'; break;
case 16: ps2='Q'; break;
case 17: ps2='R'; break;
case 18: ps2='S'; break;
case 19: ps2='T'; break;
case 20: ps2='U'; break;
case 21: ps2='V'; break;
case 22: ps2='W'; break;
case 23: ps2='X'; break;
case 24: ps2='Y'; break;
case 25: ps2='Z'; break;
}
switch ((int)a3) {
case 0: ps3='A'; break;
case 1: ps3='B'; break;
case 2: ps3='C'; break;
case 3: ps3='D'; break;
case 4: ps3='E'; break;
case 5: ps3='F'; break;
case 6: ps3='G'; break;
case 7: ps3='H'; break;
case 8: ps3='I'; break;
case 9: ps3='J'; break;
case 10: ps3='K'; break;
case 11: ps3='L'; break;
case 12: ps3='M'; break;
case 13: ps3='N'; break;
case 14: ps3='O'; break;
case 15: ps3='P'; break;
case 16: ps3='Q'; break;
case 17: ps3='R'; break;
case 18: ps3='S'; break;
case 19: ps3='T'; break;
case 20: ps3='U'; break;
case 21: ps3='V'; break;
case 22: ps3='W'; break;
case 23: ps3='X'; break;
case 24: ps3='Y'; break;
case 25: ps3='Z'; break;
}
if (h1 == ps1 && h2 == ps2 && h3 == ps3 && h == x)
break;
}
printf("%c %c %c %f %f\n", ps1, ps2, ps3, x, p);
return 0;
}
C code using if's, no cast:
Code: Select all
#include <stdio.h>
int main() {
double p;
float x=-1;
float a1,a2,a3;
char ps1,ps2,ps3;
char h1,h2,h3;
float h;
p = 0; /* need to init these for C */
a1=a2=a3=h=0; /* need to init these for C */
h1='L';
h2='W';
h3='K';
h=3724;
for (;;) {
x+=1;
p+=1;
if (x>9999) {
x=0;
a3+=1;
if (a3>25) {
a3=0;
a2+=1;
if (a2>25) {
a2=0;
a1+=1;
}
}
}
if (a1 == 0) ps1='A';
else if (a1 == 1) ps1='B';
else if (a1 == 2) ps1='C';
else if (a1 == 3) ps1='D';
else if (a1 == 4) ps1='E';
else if (a1 == 5) ps1='F';
else if (a1 == 6) ps1='G';
else if (a1 == 7) ps1='H';
else if (a1 == 8) ps1='I';
else if (a1 == 9) ps1='J';
else if (a1 == 10) ps1='K';
else if (a1 == 11) ps1='L';
else if (a1 == 12) ps1='M';
else if (a1 == 13) ps1='N';
else if (a1 == 14) ps1='O';
else if (a1 == 15) ps1='P';
else if (a1 == 16) ps1='Q';
else if (a1 == 17) ps1='R';
else if (a1 == 18) ps1='S';
else if (a1 == 19) ps1='T';
else if (a1 == 20) ps1='U';
else if (a1 == 21) ps1='V';
else if (a1 == 22) ps1='W';
else if (a1 == 23) ps1='X';
else if (a1 == 24) ps1='Y';
else if (a1 == 25) ps1='Z';
if (a2 == 0) ps2='A';
else if (a2 == 1) ps2='B';
else if (a2 == 2) ps2='C';
else if (a2 == 3) ps2='D';
else if (a2 == 4) ps2='E';
else if (a2 == 5) ps2='F';
else if (a2 == 6) ps2='G';
else if (a2 == 7) ps2='H';
else if (a2 == 8) ps2='I';
else if (a2 == 9) ps2='J';
else if (a2 == 10) ps2='K';
else if (a2 == 11) ps2='L';
else if (a2 == 12) ps2='M';
else if (a2 == 13) ps2='N';
else if (a2 == 14) ps2='O';
else if (a2 == 15) ps2='P';
else if (a2 == 16) ps2='Q';
else if (a2 == 17) ps2='R';
else if (a2 == 18) ps2='S';
else if (a2 == 19) ps2='T';
else if (a2 == 20) ps2='U';
else if (a2 == 21) ps2='V';
else if (a2 == 22) ps2='W';
else if (a2 == 23) ps2='X';
else if (a2 == 24) ps2='Y';
else if (a2 == 25) ps2='Z';
if (a3 == 0) ps3='A';
else if (a3 == 1) ps3='B';
else if (a3 == 2) ps3='C';
else if (a3 == 3) ps3='D';
else if (a3 == 4) ps3='E';
else if (a3 == 5) ps3='F';
else if (a3 == 6) ps3='G';
else if (a3 == 7) ps3='H';
else if (a3 == 8) ps3='I';
else if (a3 == 9) ps3='J';
else if (a3 == 10) ps3='K';
else if (a3 == 11) ps3='L';
else if (a3 == 12) ps3='M';
else if (a3 == 13) ps3='N';
else if (a3 == 14) ps3='O';
else if (a3 == 15) ps3='P';
else if (a3 == 16) ps3='Q';
else if (a3 == 17) ps3='R';
else if (a3 == 18) ps3='S';
else if (a3 == 19) ps3='T';
else if (a3 == 20) ps3='U';
else if (a3 == 21) ps3='V';
else if (a3 == 22) ps3='W';
else if (a3 == 23) ps3='X';
else if (a3 == 24) ps3='Y';
else if (a3 == 25) ps3='Z';
if (h1 == ps1 && h2 == ps2 && h3 == ps3 && h == x)
break;
}
printf("%c %c %c %f %f\n", ps1, ps2, ps3, x, p);
return 0;
}