All'interno del suo programma
Top Fuel giustamente avverte che "
sui numeri grossi (sopra il milione) il programma ci metterà parecchio".
Confrontiamo, dunque, per mera curiosità le prestazioni di Gambas con quelle di un codice scritto in C, trasformato in libreria dinamica .so richiamata successivamente in un programma Gambas.
Utilizzate un valore, ad esempio, di 10000000 (diecimilioni) per entrambe le prove - con il codice Gambas (quello già disponibile di
Top Fuel) e con il codice C della libreria esterna .so - e verificate il tempo impiegato da ciascuno dei due programmi nel rispettivo processo dei dati.
Il programma Gambas che utilizzerà il codice C puro, sarà il seguente:
Private Extern Eratostene_C(limes As Integer) As Integer In "/tmp/crivello"
Public Sub Main()
Dim limite, i As Integer
limite = 10000000
' Crea l'apposita libreria dinamica .so esterna:
Creaso()
' Invoca la funzione esterna della libreria dinamica .so:
i = Eratostene_C(limite)
If i < 0 Then Error.Raise("Memoria insufficiente !")
End
Private Procedure Creaso()
File.Save("/tmp/crivello.c", "#include <stdio.h>\n"
"#include <stdlib.h>\n" &
"#include <string.h>\n" &
"#include <math.h>\n\n" &
"int Eratostene_C(int limes) {\n\n" &
" int lim, dim, i, j, z;\n" &
" int *list;" &
"\n\n" &
" dim = (limes / 2 + 1);\n" &
" if((list = (int *)calloc(sizeof(int), dim)) == NULL)\n" &
" return -1;\n\n" &
" for(i=0; i<dim; i++)\n" &
" list[i]=0;\n\n" &
" printf(\"2 \");\n\n" &
" lim = (int)sqrt(limes);\n\n" &
" for(j=1,i=3; i<=lim; ++j,i+=2) {\n" &
" if(!list[j]) {\n" &
" for(z=j+i; z<dim; z+=i)\n" &
" list[z] = -1;\n" &
" printf(\"%d \", i);\n" &
" }\n }\n\n" &
" for(; i<limes; i+=2, ++j)\n" &
" if(!list[j])\n" &
" printf(\"%d \", i);\n\n" &
" return 0;\n\n}")
Shell "gcc -o /tmp/crivello.so /tmp/crivello.c -shared -fPIC -lm" Wait
End