Re: очень хочется squirrelsh
Oleg Tsymaenko пишет:
Примеры с циклом в 100,000,000 итераций (src ниже):
-------+----------+-----+---------------------------
язык время(s) K компилятор/интерпретатор
-------+----------+-----+---------------------------
C 0.315 1 gcc 4.3.4 (с "-O1" )
java 30.520 97 sun-java-1.5.0 (libgcj4.3.4)
perl 72.149 229 perl (v5.10.1)
php 71.872 228 php-cli(5.2.11 Zend-2.2.0)
python 110.251 350 python(2.5.4)
ruby 177.122 562 ruby(1.8.7)
============= hello.c ==========================
#include "stdio.h"
main(){
int i;
double x;
for (i=0,x=0;i<100000000;i++)
x+=1.1*i;
printf("i=%d; x=%.2f\n",i,x);
}
============= hello_java.java ==================
Если уж до кучи.
Forth
#time spf4 test3.f
i=100000000 x=5499999945000000.0
real 0m0.375s
user 0m0.360s
sys 0m0.008s
gcc без оптимизации
#time ./test
i=100000000; x=5499999945475522.00
real 0m0.533s
user 0m0.516s
sys 0m0.000s
Разница в полученной x из-за того, что gcc без оптимизации теряет точность в каждом цикле делая преобразование из памяти
в FPU стек и наоборот.
Forth с эмуляцией поведения gcc без оптимизации:
#time spf4 test.f
i=100000000 x=5499999945475522.0
real 0m1.038s
user 0m1.036s
sys 0m0.004s
Соответственно, gcc с оптимизацией -O3, даёт правильное значение x
gcc -o3
#time ./test3
i=100000000; x=5499999945000000.00
real 0m0.214s
user 0m0.184s
sys 0m0.000s
====================================
Исходники:
#cat test.f
REQUIRE CODE lib/ext/spf-asm.f
REQUIRE F. lib/include/float2.f
17 SET-PRECISION
CODE FLOAT<>DATA
FSTP QWORD -8 [EBP]
FLD QWORD -8 [EBP]
RET
END-CODE
: ttt
1.1e0 .E 100000000 0
BEGIN
FOVER DUP DS>F 1+ F* F+
FLOAT<>DATA
2DUP =
UNTIL
." i=" . ." x=" G. CR
BYE
;
ttt
#cat test3.f
REQUIRE F. lib/include/float2.f
17 SET-PRECISION
: ttt
1.1e0 .E 100000000 0
BEGIN
FOVER DUP DS>F 1+ F* F+
2DUP =
UNTIL
." i=" . ." x=" G. CR
BYE
;
ttt
=============================
Для сравнения, данные по остальным интерпретаторам:
-----------------------------
ответ i=100000000; x=5499999945000000.00
forth 0m0.375s -- интерпретация test3.f
-----------------------------
все остальные дают в ответе: i=100000000 x=5499999945475522.00
forth 0m1.038s -- интерпретация test.f (с эмуляцией поведения gcc)
lua 0m15.929s
php 0m26.187s
python 0m57.115s
ruby 1m36.095s
java 6m25.742s -- bsh интерпретатор java
=============================
Компиляторы:
-----------------------------
ответ i=100000000; x=5499999945000000.00
gcc 0m0.214s -- с оптимизацией -O3
-----------------------------
все остальные дают в ответе: i=100000000 x=5499999945475522.00
java 0m0.330s -- компилированный test.class
gcc 0m0.533s -- без оптимизации
javac+java 0m0.813s -- java вместе с компиляцией и исполнением
Reply to: