Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - visual basic 2008, dubbio sulla velocità di un algoritmo
Forum - C# / VB.NET - visual basic 2008, dubbio sulla velocità di un algoritmo

Avatar
giova95 (Normal User)
Rookie


Messaggi: 29
Iscritto: 23/12/2011

Segnala al moderatore
Postato alle 19:46
Venerdì, 23/12/2011
Innanzitutto buona sera e buon natale :)
Mi scuso se ho sbagliato la sezione ma essendo praticamente autodidatta non so la differenza tra visual basic 5 o 6 e tutti gli altri :(

Ho recentemente sviluppato un programmino per codificare delle stringe di testo. Il programma è molto semplice e si basa sulla conversione di ogni singola lettera in un numero, poi il numero viene sommato al numero della "chiave di criptazione" e il risultato viene riconvertito in lettera.  Come già detto sono autodidatta e so anche che non è il miglior modo per codificare, ma a me interessava solo allenarmi su visual basic, non devo nascondere informazioni della N.A.S.A. :)

Dopo una serie di passaggi ottengo nella variabile S un valore, e in base al valore di S (che può essere compreso tra 0 e 114) il programma mi restituisce un output diverso.
Il problema è che l'output che corrisponde al valore 0 è uguale all'output di 58.
Così come 1 corrisponde a 59, 2 corrisponde a 60.... 57 corrisponde a 114
Queste corrispondenze nascono da questo passaggio

  If y < x Then
                S = x - y
  Else
                S = z - y
  End If

Ed il fatto è che sono obbligato a fare questo passaggio... quindi evitate di dirmi di editare questa struttura :)
Il mio dubbio si presenta nel momento in cui devo verificare il valore di S.
In precedenza avevo fatto in questo modo:

Select Case S
                Case 1, 58
                    output = "a"
                Case 2, 59
                    output = "b"
                .
                .
                .
                Case 57, 114
                    output = " "
End Select

Ora ricontrollando il tutto mi è venuto in mente che potevo fare in questa maniera:

If y < x then
   S = x - y
   Select Case S
                Case 1
                    output = "a"
                Case 2
                    output = "b"
                .
                .
                .
                Case 57
                    output = " "
   End Select
Else
  Select Case S
                Case 58
                    output = "a"
                Case 59
                    output = "b"
                .
                .
                .
                Case 114
                    output = " "
  End Select
End If

So che la differenza risulterà di pochi millisecondi, ma secondo voi quale dei 2 modi è il più veloce?

Grazie in ogni caso ;)
Gio

PM
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 21:16
Venerdì, 23/12/2011
anche se sei autodidatta non significa che la logica sia da buttar via.
TI sei chiesto come fare a decriptare con il tuo algoritmo? Se l'output non è univoco, non potrai mai sapere da quale chiave sei partito no?

Inizia a pensare ad un algoritmo migliore ed allora vedrai che non ti capiteranno più casi in cui scegliere tra due strutture "select case" come hai postato.

Comunque, tra le due, preferisco la prima perché è la più chiara...non mi piace ripetere troppo codice simile quando si può evitare. Però ripeto...sono due scelte sbagliate tutte e due. Ripensa prima al tuo algoritmo.

no no :) non hai capito il programma, probabilmente mi sono spiegato male e ovviamente non mettendo tutto il codice del programma è poco comprensibile. Io devo codificare del testo, non decodificare, quindi la chiave la devo inserire io xD Cmq il programma funziona a meraviglia :) Mi serve solo sape - giova95 - 24/12/11 08:01
sapere quale delle 2 strutture è più veloce. E' più veloce la prima struttura che per ogni "riga" propone 2 casi oppure la seconda struttura? so che la prima è più semplice da leggere, più corta e più ordinata... però in questo momento interessa la velocità ;) grazie :) - giova95 - 24/12/11 08:03
PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
0
Down
V
Segnala al moderatore
Postato alle 12:13
Sabato, 24/12/2011
Più che millisecondi, direi che la differenza è appena quantificabile...

Un modo più compatto è, ad esempio:
Codice sorgente - presumibilmente Plain Text

  1. output = Chr(96 + S % 57)


Infatti per S = 1 o S = 58, S % 57 = 1, perciò output = "a".
Funziona se i carattere che intendi porre in output seguono l'ordinamento consueto ascii. Dato che l'ultimo carattere è lo spazio, direi che non segui la codifica, ma se in alcuni intervalli le lettere sono in ordine, puoi comunque adattare il calcolo a pochi casi particolari.

si lo so, ci avevo già pensato... ma il fatto è che non voglio seguire l'ordine ascii... se no sarebbe troppo facile effettuare una decodifica :) - giova95 - 25/12/11 10:30
PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6380
Iscritto: 03/01/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 17:23
Sabato, 24/12/2011
Il primo codice potrà essere più veloce in maniera impercettibile.

Ma sarebbe saggio seguire quello che ti ha scritto Totem.

grazie :) - giova95 - 25/12/11 10:30


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM