[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: