Question

Alors que la question vérifier si l'entrée est un type de chaîne a été fermé, deux des réponses ont soulevé une question de micro-optimisation dans mon esprit :laquelle des deux solutions ci-dessous fonctionnerait le mieux ?

Reed Copsey fourni un solution utilisant Char.IsLetter:

string myString = "RandomStringOfLetters";
bool allLetters = myString.All( c => Char.IsLetter(c) );

Adapté solution utilisant regex depuis Marc Byers:

string s = "RandomStringOfLetters";
bool allLetters = Regex.IsMatch(s, "^[a-z]+$", RegexOptions.IgnoreCase);

Ne voulant pas simplement poser la question à Reed ou à Mark, j'ai pensé écrire un test rapide pour déterminer lequel fonctionnait le mieux.Le problème est que je n'ai pas fait beaucoup d'optimisation du code (j'ai tendance à mettre la lisibilité du code avant tout).

Outre la prise d'un horodatage avant et après l'exécution de chacun, quelles sont les autres (meilleures ?) options pour déterminer quelle solution s'exécute plus rapidement ?

Modifier

j'ai modifié La réponse de Martin travailler avec Console.WriteLine(...) et je l'ai exécuté en tant qu'application console.Je ne sais pas exactement comment LinqPad exécute des applications mais les résultats étaient à peu près les mêmes :

41
178
Était-ce utile?

La solution

Vous voudrez faire cela, mesurer les roulements à l'aide d'un Chronomètre .En outre, voici quelques éléments très importants à garder à l'esprit lors du profilage:

  1. exécutez toujours votre test plus d'une fois.La première fois que vous l'exécutez, il y aura des frais généraux de la JIT et les timings peuvent être trompeurs.Courir plusieurs fois et prendre la moyenne est une bonne approche (je vais souvent exécuter un test comme celui-ci 100 000 fois, par exemple.)
  2. Exécutez toujours votre test avec une version complète de la version, en dehors du processus d'hébergement Visual Studio.(Par défaut, vous pouvez utiliser Ctrl + F5 pour cela.) L'hôte Visual Studio a considérablement une incidence sur les horaires.

Autres conseils

tu devrais vérifier System.Diagnostics.Stopwatch!

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Vous devez exécuter la chose plusieurs fois en boucle pour réduire les erreurs de timing et autres facteurs incontrôlables.

J'espère que cela pourra aider.

Je viens de mettre cela ensemble dans Linqpad comme exemple de la façon dont je le ferais (d'où leAppels à décharger () - remplacer par console.writeline (...) si vous n'utilisez pas cet outil pratique).

On dirait que la voie Linq est légèrement plus que quatre fois plus rapide:

System.Diagnostics.Stopwatch stopwatch = new Stopwatch();

stopwatch.Start();
for (int i = 0; i < 100000; i++)
{
 string myString = "RandomStringOfLetters";
 bool allLetters = myString.All( c => Char.IsLetter(c) );
}
stopwatch.Stop();
stopwatch.ElapsedMilliseconds.Dump();

stopwatch.Reset();

stopwatch.Start();
for (int i = 0; i < 100000; i++)
{
 string s = "RandomStringOfLetters";
 bool allLetters = Regex.IsMatch(s, "^[a-z]+$", RegexOptions.IgnoreCase);
}
stopwatch.Stop();
stopwatch.ElapsedMilliseconds.Dump();

sortie:

47 
196

Il existe une classe System.Diagnostics.stopwatch qui peut être utilisée.

Quel que soit le code que vous testez, exécutez le test une fois pour supprimer les coûts JIT, puis exécutez-le à nouveau pour les horaires finaux.La plupart des numéros de chronométrage individuels pourraient être non représentatifs en raison d'autres facteurs sur le PC - gèrent donc de nombreuses itérations, puis calculez le temps d'exécution moyen de cela.

Utilisez la classe System.Diagnostics.stopwatch.

Démarrez le chronomètre et courez plusieurs milliers d'itérations, arrêtez-le et vérifiez les millisecondes totales qui ont été écoulées

Étapes pour déterminer ce qui est plus rapide: -

  1. Obtenez une collection d'ordinateurs, quelques centaines de cent devraient faire, AMD / Intel / Autre, 32 bits / 64 bits, ...

  2. Installez tous les caractères .NET que vous vous souciez de chacun d'eux (à son tour)

  3. Essayez chaque combinaison d'options d'optimisation pour la compilation (à son tour)

  4. Utilisez chronomètre pour tester une grande course pour chaque

  5. Surveiller l'utilisation de la mémoire pour chacun, comme cela peut avoir un impact plus important sur le reste de votre application.Économiser quelques cycles au prix de la consommation de mémoire accrue et plus d'activité de collecte des ordures est souvent une mauvaise "optimisation".

  6. que pourrait vous donner une idée de savoir ce qui est plus rapide dans la pratique, au moins pour les versions actuelles du compilateur.Répétez avec chaque nouvelle version du compilateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top