|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Mar 2010
Messaggi: 46
|
Linguaggio di programmazione, quale e' il piu veloce?
Salve, sto cercando di risolvere un problema matematico;
ho realizzato il mio software in alcuni linguaggi, ma ho bisogno di piu velocita' ancora perche per giungere alla risoluzione dovranno essere fatti molti miliardi di miliardi di calcoli matematici. Attualmente sto provando col QB64 (che se non sbaglio compila in C++) ma pur adottando la via di espandere il programma al massimo senza usare variabili del tipo a(10) che portano via molto tempo di calcolo, ma usando invece a1, a2, a3 etc, ancora la velocita' non e' abbastanza e ci impieghera' molti anni. Inoltre il QB64 (come il quickbasic) non supporta il "goto 1000+a" ma solo goto fissi. Questo ostacolo e' difficilmente aggirabile e con il ON a GOTO 1001,1002,1003 etc il sistema rallenda a dismisura quasi piu che scrivere decine di IF-GOTO. ..e con CALL la velocita rallenta ancora di piu'... Domanda 1: Quale e' un linguaggio di programmazione che mi puo dare piu velocita' di calcolo? magari con GOTO 1001+a (GOTO dinamici) ? Domanda2: Inoltre posso chedervi se qualcuno sa' la formula per sapere da quanti bit e' composto un mumero ? es: premdiamo il numero 8 che in unsigned binario e' 1000 e quindi composto da 4 bit, esiste una formula veloce(la velocita' e' essenziale!) per sapere quanti bit occupa ??? (cioe' da 8 o 1000 ottenere 4 o 100) Grazie in anticipo, Soniaa |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Nov 2013
Messaggi: 9
|
Inviato dal mio Nexus 7 utilizzando Tapatalk
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Feb 2004
Città: milano
Messaggi: 2144
|
Non ho capito nulla di quello che hai scritto
![]() Forse però ti conviene non usare i goto che sono il male, quasi assoluto ![]() Detto questo per calcolare quanti bit necessita un numero si usano i logaritmi. Non ci si scappa. numero_bit = ceil(ln(numero) / ln(2)); Ciao Ultima modifica di airon : 16-11-2013 alle 00:30. |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
Quote:
Mostra il codice e ti possiamo dare una mano. Che altri linguaggi hai usato? Hai provato Fortran? http://www.fortrantutorial.com/ È considerato il nonno di matlab, è fatto per la matematica (fortran = formula translator) e non credo esistano linguaggi più rapidi, a parte il linguaggio macchina.
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli! ![]() Ultima modifica di ingframin : 16-11-2013 alle 06:38. |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
In effetti Fortran ancora oggi rimane imbattuto per macinare numeri. Si potrebbe pensare di realizzare il core dell'algoritmo in assembly ottimizzato a manina, ma prima... bisognerebbe conoscere l'algoritmo da velocizzare, appunto.
Certamente per tirare fuori il numero di bit utilizzati non ricorrerei alla formuletta classica che è stata posta. A seconda dei casi (cioè del range di valori da elaborare), si potrebbe usare l'algoritmo di bisezione, una LUT, oppure una combinazione dei due. In generale e per quanto possibile, è sempre meglio evitare l'uso di salti, specialmente se condizionati.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
In FORTRAN puoi usare dei GOTO "dinamici":
Codice:
SUBROUTINE MYSUBWITHGOTO(K) // dichiarazioni C GOTO (10,1,2,3,4,5,6,7,8,9,91,92,93,930,931,3,98,84,18,19,20,21, # 22) K+1 C |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4906
|
"formula veloce"?
http://x86.renejeschke.de/html/file_...x86_id_20.html |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Mar 2010
Messaggi: 46
|
Spero non pensiate che il mio silenzio sia ingratitudine,...
..anzi vi RINGRAZIO tantissimo e avete risposto esattamente alle mie domande. Ora elaboro i vostri consigli...dunque Fortran... uhmm, da una prima occhiata non sembra difficile...ce la potrei fare..credo... stasera faro' un primo approccio al Fortran e qualche test di velocita' di puro calcolo matematico(a me serve solo puro calcolo,pero' man mano che il mio programma arrivera' a punti precisi, dovra' esportare in un normalissimo file txt circa 40 numeri...che alla fine diventeranno qualche miliardo,spero si possa col fortran salvare dati su file...non necessariamente grandi ma diverse migliaia di file (aprendoneo 1 alla volta e quando vi ho inserito esempio 1000000 di numeri, chiuderlo e aprirne un nuovo altro vuoto), poi vi dico... Graziee |
![]() |
![]() |
![]() |
#9 | |
Member
Iscritto dal: Mar 2010
Messaggi: 46
|
Quote:
ma non esistono piu i vecchi "GOTO 1000+a" oppure "GOTO a$" oppure "GOTO VAL (A$)"??? ,..quelli si' che facevano girare i programmi veloce!!! Ultima modifica di soniaa : 16-11-2013 alle 14:08. |
|
![]() |
![]() |
![]() |
#10 | |
Member
Iscritto dal: Mar 2010
Messaggi: 46
|
Quote:
QB64 compila solo, (in C++ credo) e la velocita' del C++ rispetto al C e' maggiore di circa 40 per cento sul mio programma... Ultima modifica di soniaa : 16-11-2013 alle 14:17. |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Potresti usare un vettore di puntatori a funzione in C ... mi sembra assurdo parlare di GOTO o ON GOTO ...
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Forse vuole dire che il compilatore trasforma il sorgente QB in un sorgente C che poi viene compilato da un compilatore C.
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Non mi pare succedesse per tutte le versioni di QB ma mi sembra di ricordare (è passato un po' di tempo) che il "Basmark QuickBASIC" (che ho usato su SCO Xenix) funzionasse così ...
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
|
|
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: Mar 2010
Messaggi: 46
|
Sto provando sto Fortran...
Rispetto al QB64; piu veloce nei loop (il doppio/triplo) piu veloce IF (+400%) piu LENTO nel puro calcolo (-il doppio/triplo) |
![]() |
![]() |
![]() |
#16 |
Member
Iscritto dal: Mar 2010
Messaggi: 46
|
TEST 1 (FOR / LOOP) QB64 4.5sec Fortran 2.0sec
![]() QB64 code: DIM a AS LONG FOR a = 1 TO 1000000000 NEXT a Fortran code: program first integer a do a=1,1000000000 end do end program first |
![]() |
![]() |
![]() |
#17 |
Member
Iscritto dal: Mar 2010
Messaggi: 46
|
TEST 2 (IF) QB64 12sec Fortran 5sec
![]() QB64 code: DIM a AS LONG FOR a = 1 TO 1000000000 IF b > a THEN b = 33 IF c > a THEN c = 44 IF d > a THEN d = 55 NEXT a Fortran code: program first integer a,b,c,d b=12 c=13 d=14 do a=1,1000000000 IF (b > a) b = 33 IF (c > a) c = 44 IF (d > a) d = 55 end do end program first |
![]() |
![]() |
![]() |
#18 |
Member
Iscritto dal: Mar 2010
Messaggi: 46
|
TEST 3 (puro calcolo)
![]() QB64 code: DIM a AS LONG FOR a = 1 TO 1000000000 b = a / 1003 + a / 1005 c = a / 1008 + a / 1002 d = a / 1001 + a / 1006 NEXT a Fortran code: program first integer a,b,c,d b=12 c=13 d=14 do a=1,1000000000 b = a / 1003 + a / 1005 c = a / 1008 + a / 1002 d = a / 1001 + a / 1006 end do end program first Ultima modifica di soniaa : 17-11-2013 alle 01:16. |
![]() |
![]() |
![]() |
#19 | |
Member
Iscritto dal: Mar 2010
Messaggi: 46
|
Quote:
ln immagino che sia log a base10 vero? ma il ceil cosa significa? forse la parte intera?...ma allora alla tua formula bisogna alla fine aggiungere "+1" vero??? inoltre: se i GOTO sono sconsigliati allora cosa usi dei CALL/Function??? (che pero sono molto piu leenti dei GOTO!!!) Ultima modifica di soniaa : 17-11-2013 alle 01:39. |
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
p.s.: ln è il logaritmo naturale
Lascia perdere questa bigiolica sui goto. Sto cazzo di Djkstra ha fatto il lavaggio del cervello a tutti ormai...I goto non vanno quasi mai bene quando si implementa una logica, ed è ovvio, ma se li si vuole usare in casi come questo, dove svolgono la funzione di switch/case, in un pezzo di codice per il calcolo numerico dove non c'è neanche una logica da implementare, allora non rompete l'anima! ![]() Io personalmente li uso in Fortran proprio in questo modo e non danno mai problemi. Tutt'altra cosa sarebbe usarli per rompere dei cicli o far cose logicamente meno ovvie. Inoltre li uso nei programmini di test che faccio ogni tanto in C++ per tornare all'inizio dell'esecuzione se l'utente dice di continuare, molto più pratico che stare a wrappare tutto in un ciclo strutturato, e anche lì non si rischiano errori di alcun tipo... |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:26.