Velocità oltre ogni limite: VB + Dx + C++

Inizio l'articolo con una amara e dura realtà per coloro che non lo sapessero: Visual Basic è e sarà sempre più lento del C. Questo perchè è un linguaggio interpretato e non compilato. Di conseguenza quando realizzerete un programma questo avrà sempre delle prestazioni minori rispetto ad altri linguaggi. Ma è possibile tuttavia accellerare notevolmente il programma utilizzando le DLL;  questo sito, dopotutto,  parla di questo : potenziare il visual basic tramite DirectX8 che altro non è che una DLL. Ebbene, se microsoft ha risolto il problema grafico noi possiamo intervenire per quello di calcolo. Una DLL ben utilizzata può accellerare le funzioni di calcolo (specie quelle lunghe con matrici) in maniera enorme. Attenzione però, una DLL può anche rallentare il codice se utilizzata per calcoli troppo brevi ed è quindi necessario capire quando è meglio del codice basic o del codice C. Solo la pratica può aiutare ma in genere è preferibile per l'uso delle matrici e di grossi calcoli numerici dato che in C si possono usare i puntatori (accesso diretto alla memoria per variabili e matrici). Per coloro che non sono molto pratici del C++ sarà pubblicato un tutorial sul C++ con le funzioni base per ogni esigenza. Ora si va ad iniziare.

Requisiti per il tutorial

Editor C++ (io uso Visual C++).

Diversamente dal solito aprite Visual C++ e selezionate nuovo dal menù. Vi apparirà questa finestra.

 Selezionate Win32 Dynamic-Link Library e date un nome al project che sarà il nome della DLL. Nella schermata successiva scegliete Libreria Vuota (empty library). Ora vi trovate un progetto completamente vuoto da cui iniziare. Dal menù view (scusate io ho la versione in inglese) scegliete workspace se non è possibile visualizzare la finestra di progetto (qualcosa di simile a quella in VB). Ora dal menu file scegliete nuovo ma stavolta andate in files e non in project (vedi sempre la stessa figura). Da qui scegliete "C++ source files" e dategli un nome qualsiasi: qui scriverete il vostro codice. Dato che nel prossimo tutorial vi spiegherò un pò di C++ qui vi dico solo come si inposta un funzione che esegui la somma e il prodotto fra variabili Long. Innanzitutto ci sono due primissime regole:

  1. variabili e routine vanno sembre dichiarate
  2. ricordate sempre il ";" dopo le istruzioni.

Ora una piccola premessa. Questo argomento è molto diffuso in rete e in molti casi ho trovato metodi differenti. Io come al solito seguo il mio, altri siti seguono il loro, senza sapere quale sia il migliore andiamo oltre. Ecco il codice C++

 

__declspec( dllexport ) long _stdcall somma(long a, long b);

__declspec( dllexport ) long _stdcall prodotto(long a, long b);




__declspec( dllexport ) long _stdcall somma(long a,long b){
//restituisce la somma
return (a+b);
}



__declspec( dllexport ) long _stdcall prodotto(long a,long b){
//restituisce il prodotto
return (a*b);
}

 

Nelle prime due righe ho dichiarato le funzioni somma e prodotto. L'istruzione  __declspec( dllexport ) serve a specificare che la funzione deve essere esportabile e long _stdcall serve a dire che la funzione deve essere di tipo Long e secondo le specifiche stdcall (per farle girare sotto VB). Somma(long a,long b) altro non è che la dichiarazione della funzione. Notate le parentesi graffe che aprono e chiudono le funzioni e i due "//" che dichiarano un commento. Return chiude la funzione e restituisce il valore (in questo caso l'operazione). Ora le due operazioni sono definite. Andate di nuovo a new e stavolta aprite un Text File che chiamerete "nome del progetto che è anche il nome della DLL" .Def. Qui vanno specificate quali funzioni esportare. Il codice da inserire qui è questo

LIBRARY funzioni;
EXPORTS
somma
prodotto

LIBRARY seguito dal nome della DLL indica il nome. Sotto esports vanno i nomi delle funzioni da esportare (se mettete delle routine per i conti magari preferite che non siano accessibili).

Ora compilate ma prima andate a set active configuratio in Build e scegliete release invece di debug. In debug si compila più veloce ma poi la Dll diventa lenta rendendo inutile quanto fatto finora.

Una volta compilata la dll è pronta nella cartella Debug o Release. Ora torniamo a VB.

Aprite un progetto e dichiarate la funzione come un' API

Private Declare Function somma Lib "funzioni.dll" (ByVal a As Long, ByVal b As Long) As Long
 

Ora il form ha una istruzione in più. Inserite in un command l'istruzione

Print somma(5, 6)
 

e sul form comparirà la somma tra 5 e 6. Non è molto e se usata per una sciocchezza del genere il costo della chiamata non viene recuperata nel codice ma è un inizio. Attenzione; a meno che non mettiate la DLL nella cartella System di windows la libreria funzionerà solo in eseguibile. Per farla funzione nell'editor VB oltre al nome dovete anche dichiarare anche il path ("c:/dove_se_trova_la_DLL/funzioni.dll).

Nel prossimo tutorial spiegherò un pò di C++ (il minimo necessario). Per approfondimenti andate su siti che trattano il C++ che questo non è esattamente il mio campo. Ecco il codice C++ e quello VB (nella cartella Debug). La Dll l'ho compilata in debug mode ma potete provare a ricompilarla in release. Fate un pò di prove.

 

Funzioni.zip   234Kb

 

Torna all'indice Varie