Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [c++ e in parte c#]esperimento con pinvoke di un ciclo for

    Ho provato ad eseguire un numero grande di cicli for in cui si esegue una moltiplicazione e una divisione:
    1) in c++
    2) in c#
    3) da una dll scritta in c++, ma passando a c# i risultati a attraverso "PInvoke"

    I risultati sono stati che il ciclo viene completato su di un vecchio pc in:
    1) circa 38 secondi
    2) circa 33 secondi
    3) circa 50 secondi

    Qualcuno mi sa spiegare i motivi per cui ottengo questi risultati?
    Premetto che il c++ non lo conosco bene ed ho scritto poche linee di codice solo per fare questo esperimento.

    codice:
                float Ti= clock(); //  Tempo iniziale
                double x = 1.05;
                for (int var_contatore=1; var_contatore < 1400000000; var_contatore++)
              {
                        x = x * 1.000011564;
                        x = x / 1.000011562;
              }
               float Tf= clock(); //  Tempo finale
               float TempoAccumulato = Tf -Ti; // tempo conteggiato dal reset 
               cout << "x=" << x;
               cout << "t=" << TempoAccumulato;

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Allora provo a darti una spiegazione..

    Il framework .net ha una particolarità cioè quello di trasformare il codice in un linguaggio intermedio.. questo linguaggio è interpretato ppoi dalla macchina virtuale del .net.. Questo codice intermedio però ha il pregio di riutilizzare le routines utilizzate più volte così da risparmiarsi il tempo di reinterpretare il codice ogni volta.. quindi un ciclo risulaterà sensibilmente più veloce in c#..

    Il pinvoke invece è ovviamente più lento perchè utilizza chiamate a dll esterne..

    Ovviamente è una spiegazione sommaria.. per avere più informazioni controlla sul MSDN

  3. #3
    Devi anche considerare le opzioni di compilazione.
    Ad esempio sul mio Mac passo da 31 secondi a 21 semplicemente aggiungendo la direttiva "-O4"
    ;-)

  4. #4
    Originariamente inviato da Stoicenko
    Allora provo a darti una spiegazione..

    Il framework .net ha una particolarità cioè quello di trasformare il codice in un linguaggio intermedio.. questo linguaggio è interpretato ppoi dalla macchina virtuale del .net.. Questo codice intermedio però ha il pregio di riutilizzare le routines utilizzate più volte così da risparmiarsi il tempo di reinterpretare il codice ogni volta.. quindi un ciclo risulaterà sensibilmente più veloce in c#..

    Il pinvoke invece è ovviamente più lento perchè utilizza chiamate a dll esterne..

    Ovviamente è una spiegazione sommaria.. per avere più informazioni controlla sul MSDN
    Per "routine" intendi anche un ciclo for?
    Per quanto riguarda il Pinvoke, ho provato sia a fare una sola chiamata alla dll esterna che fa tutto il ciclo, oppure a diminuire di cento volte le iterazioni nella dll e fare 100 chiamate.
    Il tempo è sostanzialmente lo stesso. Sembra che le chiamate in quanto tali non facciano perdere tempo, ma è proprio il fatto di eseguire codice "esterno".

    Giuseppe

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.