Dopo aver già visto alcune applicazioni di COBOL per l'ingegneria, calcolo irraggiamento termico e calcolo potere calorifico superiore (PCS), vediamo ora un ambito più matematico, di analisi numerica: calcolo di integrali definiti con COBOL.
Come già dsicusso altrove, COBOL è assolutamente controindicato per queste operazioni, specialmente in ambito scientifico/matematico e ingegneristico, richiedendo la valutazione di una sola operazione alla volta, oltre ad essere estremamente macchinoso, motivo per cui... Abbiamo scelto di usarlo! 😄
Nello specifico, per rifarmi alla celebre discussione Benchmark performance C, Python, MATLAB - GNU Octave, JavaScript, PHP, anche con COBOL è stata calcolata numericamente una gaussiana. Tramite poi l'aggiunta (piuttosto macchinosa rispetto ad altri linguaggi!) di un opportuno pezzo di codice, è stato calcolato il "CPU Time" quindi potendo fare un benchmark con altri linguaggi. Di fatto, il codice è stato scritto in modo "abbastanza standard" (non esente da ulteriori ottimizzazioni, tuttavia lo si può confrontare con gli altri linguaggi, il problema matematico risolto è lo stesso).
Di seguito riportato il codice (buona lettura! 😄):
IDENTIFICATION DIVISION.
PROGRAM-ID. GAUSS-NUMERIC.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 RIS PIC S9(12)V9(12) VALUE 0.
01 TEMP PIC S9(12)V9(12).
01 i PIC 9(6) VALUE 0.
01 N PIC 9(6) VALUE 10000.
01 b PIC 9(6) VALUE 25.
01 WS-CURRENT-DATE-DATA.
05 WS-CURRENT-DATE.
10 WS-CURRENT-YEAR PIC 9(04).
10 WS-CURRENT-MONTH PIC 9(02).
10 WS-CURRENT-DAY PIC 9(02).
05 WS-CURRENT-TIME.
10 WS-CURRENT-HOURS PIC 9(02).
10 WS-CURRENT-MINUTE PIC 9(02).
10 WS-CURRENT-SECOND PIC 9(02).
10 WS-CURRENT-MILLISECONDS PIC 9(02).
PROCEDURE DIVISION.
MOVE FUNCTION CURRENT-DATE to WS-CURRENT-DATE-DATA.
DISPLAY WS-CURRENT-DATE-DATA.
PERFORM N TIMES
MULTIPLY b BY b GIVING TEMP
DIVIDE N INTO TEMP GIVING TEMP
DIVIDE N INTO TEMP GIVING TEMP
MULTIPLY i BY TEMP GIVING TEMP
MULTIPLY i BY TEMP GIVING TEMP
MULTIPLY -0.5 BY TEMP GIVING TEMP
COMPUTE TEMP=2.7182818**TEMP
ADD TEMP TO RIS GIVING RIS
ADD 1 to i
END-PERFORM.
MULTIPLY 0.79788 BY RIS GIVING RIS.
MULTIPLY RIS BY b GIVING RIS.
DIVIDE N INTO RIS GIVING RIS.
DISPLAY "RIS = " RIS.
MOVE FUNCTION CURRENT-DATE to WS-CURRENT-DATE-DATA.
DISPLAY WS-CURRENT-DATE-DATA.
STOP RUN.
Considerazioni sul Benchmark: a parte la leggibilità del codice di questo linguaggio, che parla da sola, in questo caso è stato usato un compilatore online, quello di tutorialspoint.com, con N=104 e non N=106 come avevamo fatto per gli altri linguaggi (vedi benchmark): questo a causa dell'inefficienza del linguaggio, da 104 a 106 significa infatti dover attendere un tempo di esecuzione 100 volte superiore!! Quindi è conveniente fare una semplice proporzione.
Di fatto, i risultati sono questi:
- tempo iniziale: 2022122809392921
- tempo finale: 2022122809393604
Abbiamo quindi anno-mese-giorno-ora-minuti-secondi-millisecondi (approssimazione fino al centesimo di secondo), il conto della differenza lo dobbiamo fare noi manualmente ed è pari a 6,83 secondi.
NB: abbiamo detto che N=104 anziché 106, come proporzione quindi avremmo un equivalente di 683 secondi!
Sempre facendo riferimento al sito tutorialspoint.com (per avere uniformità, altrimenti non sarebbe possibile parlare di confronto, benchmark!) scriviamo l'equivalente codice con Python3 (v3.6.2, che non è nemmeno fra le versioni più recenti e performanti!): prendendo N=106 dalle prove risulta un tempo medio di 2,91 secondi. Abbiamo detto che l'equivalente in COBOL con N=106 sarebbe 683 secondi. Vale a dire che da questa prova:
Python è risultato 235 volte più veloce di COBOL!
Nella discussione Benchmark performance C, Python, MATLAB - GNU Octave, JavaScript, PHP avevamo poi visto che, per lo stesso test, C era risultato 67 volte più veloce di Python! Vale a dire che C è 67 * 235 = 15745 volte più veloce di COBOL.
Usando il compilatore C online di tutorialspoint.com, C ha un tempo di esecuzione medio pari a 0,0596 secondi, vale a dire 49 volte più veloce di Python, 11460 volte più veloce di COBOL.
Una domanda sorge spontanea: perché usare COBOL per l'ambito matematico e scientifico? Semplice: perché è divertente, scomodo, assurdo e non ha alcun senso. Quindi è una cosa da fare! 😄