none
Vitesse du code compilé RRS feed

  • Question

  • Bonjour,

     

    Dans un tread

    http://social.msdn.microsoft.com/Forums/fr-FR/vbasicfr/thread/58d3917d-cbd3-4ce2-be47-b68434f6031f/#c912b84c-64e6-42d3-8b42-7e6a833da21a

    Gilles Tourreau nous dit que le compilateur produit le même code MSIL en C# ou VB

    hors j'écris un même code en C# et VB et je lance le pgm en C# avant celui en VB et au bout de plusieurs minutes VB double C#

    Je lance ces deux pgm sur mon PC (dual core 2GB de RAM en même temps donc ressources dispo identiques.

    Si le code généré est identique, comment expliquer que VB va plus vite que C#?

    Voici mes codes:

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace csharpTestSpeedCompiloConsole
    {
     class Program
     {
      static void Main(string[] args)
      {
       DateTime TempsDepart = DateTime.Now;
       TimeSpan TempsPasse;
       Int64 compteur = 0;
       int a, b, c, d, f, g;
       for (a = 1; a < 5; a++)
       {
        for (b = 1; b < 61; b++)
        {
         for (c = 1; c < 197; c++)
         {
          for (d = 1; d < 197; d++)
          {
           for (f = 1; f < 197; f++)
           {
            for (g = 0; g < 3; g++)
            {
             compteur++;
             Console.WriteLine(compteur.ToString());
            }
           }
          }
         }
        }
       }
        // affichage des résultats
        Console.WriteLine(compteur.ToString());
        //Chrono.Stop() ' Arrêt du chrono
        TempsPasse = DateTime.Now - TempsDepart;
        Console.WriteLine("Process executé en " + TempsPasse.ToString() + " millisecondes.");
        Console.ReadKey();
      }
     }
    }
    ----------------------------------------

    Module Module1
        Sub Main()
            Dim TempsDepart, TempsPasse As TimeSpan
            Dim compteur As Int64 = 0
            Dim a, b, c, d, f, g As Integer
            For a = 1 To 4
                For b = 1 To 60
                    For c = 1 To 198
                        For d = 1 To 198
                            For f = 1 To 198
                                For g = 0 To 2
                                    compteur += 1
                                    Console.WriteLine(compteur.ToString())

                                Next
                            Next
                        Next
                    Next
                Next
            Next
            ' affichage des résultats
            Console.WriteLine(compteur.ToString())
            'Chrono.Stop() ' Arrêt du chrono
            'TempsPasse = DateTime.Now - TempsDepart;
            Console.WriteLine("Process executé en " + TempsPasse.ToString() + " millisecondes.")
            Console.ReadKey()
        End Sub
    End Module

     


    fred
    vendredi 9 juillet 2010 12:31

Réponses

Toutes les réponses

  • Bonjour Fred,

     

    Le code IL est compilé en code natif par le même compilateur JIT, donc il n’y a aucune possibilité d’obtenir des exécutables différentes. C’est vrai, on a quelques différences entre VB.NET et C#, concernant la code IL généré pour quelques instructions, mais une différence notable n’existe pas.

     

    Si vous voulez investiguer en détail les différences entre le code généré par C# et le code généré par VB.NET, vous pouvez utiliser ildasm.exe

     

    Dans le cas de votre projet de teste, assurez-vous que vous avez les mêmes références pour les deux projets, ça pourrait faire la différence.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Astuces pour Visual Studio 2010

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

     

    vendredi 9 juillet 2010 13:26
  • Bonjour,

    Je rajouterai que la mesure du temps est complétement abérante. En effet, vous mesurer votre application au niveau du temps de l'horloge de l'ordinateur alors que vous devriez plustôt le faire au niveau du temps processus (temps pendant laquelle votre processus est sur le processeur).

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    vendredi 9 juillet 2010 14:16
    Modérateur
  • Bonjour,

    Et bien évidemment, il faut faire des mesures en mode Release et pas en mode Debug...

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    • Marqué comme réponse fred75 vendredi 9 juillet 2010 16:52
    vendredi 9 juillet 2010 14:22
    Modérateur
  • Bonjour,

    La différence constatée chez vous étant ?

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    vendredi 9 juillet 2010 14:23
    Modérateur
  • ok merci pour ces explications

     

    C'est vrai quelques secondes sur une heure de traitement c'est pas énorme mais sur des traitements super longs, cela peut jouer.

     

    Merci Gilles, j'étais en mode debug donc je vais refaire mes tests en mode release

     


    fred
    vendredi 9 juillet 2010 16:50