6
votes

Comment puis-je accélérer cette méthode qui supprime le texte d'une chaîne?

J'ai écrit la méthode suivante sur supprimer l'espace de noms entre parenthèses des chaînes.

Je voudrais faire cela comme possible < p> y a-t-il un moyen d'accélérer le code suivant? xxx


3 commentaires

Lequel des éléments suivants est plus rapide? ligne.Substring (POS + 1) VS Line.Substring (POS + 1, LIGNE.LENDENDÈRE - POS - 1). J'imagine que tu as testé avant et j'ai choisi plus tard ?!


Ce n'est pas lent. L'ajout de regex serait des frais généraux inutiles, à mon humble avis.


Vous pouvez déplacer POS + 1 à une variable et l'utiliser pour le début et la soustraction. Mais nous parlons nano secondes;) mais ça fait économiser +1 et -1. Aussi pour pourtant les nanosecondes. Modifier la ligne.indexof ('}') à la ligne.indexof ('}', 8, ligne.length). Enregistre une méthode appelez et numérisez les octets de départ.


11 Réponses :


1
votes

Avez-vous essayé cela avec regex et / ou utilisez un StringBuilder au lieu d'une chaîne?


0 commentaires

3
votes

Vous pouvez essayer le parallélisme car il ne semble pas avoir besoin d'un traitement synchrone. Un parallèle toandise avec Plinq ferait le tour.

Mais si vous ne pouvez pas attendre que VS2010 soit officiellement sorti, vous pouvez essayer parallèle de l'homme pauvre Offre, itérateur de Emre Aydinceren


0 commentaires

-1
votes

au lieu de votre foreach ... xxx


2 commentaires

N'est-ce pas juste en remplacement de la corse de fermeture, pas tout ce qui le précède?


Ouais ... mon mauvais ... cependant, de votre code, vous n'avez pas besoin du parum secondaire sur la sous-chaîne pour la longueur. Si vous ne fournissez que la position de départ, il retournera tout le reste de la chaîne à partir de ce point.



1
votes

Si vous avez changé de vitesse pour l'espace, vous pouvez boucler une fois dans la matrice donnée et copier des caractères autres que '{. *}'. Cela permettrait d'économiser deux appels (.indexof () et .Substring ()).


0 commentaires

3
votes

L'approche semble être calme rapidement. Mais de la chaîne que vous avez, je conclus que le nom est généralement plus petit que la {URL}. Vous pouvez utiliser la méthode .LasTindexof (). Je pense qu'il commence à partir de la fin de la chaîne


1 commentaires

J'ai essayé LastIndexof associé à Supprimer et obtenu un gain de quelques pour cent, mais uniquement lorsque le délimiteur était vers la fin de la chaîne d'entrée. Quand je l'ai déplacé vers le début, les choses ralentissent à nouveau. Bien sûr, si les données réelles correspondent toujours à cette restriction, l'OP peut en tirer parti.



2
votes

Disons que vous trouvez une réponse ici. Je pense que vous devez considérer ce que la "solution" va ressembler au prochain gars qui regarde votre code.

Je vais prendre plus de code lisible contre quelques millisecondes n'importe quel jour.


2 commentaires

Sauf si vous devez traiter quelques millions d'enregistrements par seconde.


@Matthew Whited: Le code donné a traité avec succès 1 000 000 chaînes sur mon ordinateur portable pathétique ( ark.intel. com / produit.aspx? id = 29761 ) en 0.0875438 secondes impliquant qu'il peut traiter 11 422 853 en une seconde. Donc, plus de quelques millions par seconde.



0
votes

La chose la plus lente de là, de loin, est la console.writeine ​​(). Prenez l'exemple suivant:

    public void TestCleanSpeed()
    {
        var start = DateTime.Now;
        for (var i = 0; i < 10000; i++)
        {
            string[] tests = {
                                 "{http://company.com/Services/Types}ModifiedAt",
                                 "{http://company.com/Services/Types}CreatedAt"
                             };

            foreach (var test in tests)
            {
                Console.WriteLine(Clean(test));
            }
        }
        var end = DateTime.Now;

        var ts = end - start;
        Console.WriteLine(ts);
    }


4 commentaires

La console .writeline n'est pas pertinente. Ce n'est même pas une partie de la méthode qu'il a posée sur.


Le pour (var i = 0 .... La boucle est également non pertinente. Je suppose que le tableau des tests de chaîne [] peut être grand. Vous décrivez un scénario différent.


@Jason - j'ai lu "Y a-t-il un moyen d'accélérer le code suivant?" et supposé qu'il voulait dire tout le code qu'il a affiché. Je suppose que j'ai mal compris.


@Johannes - Je mets la boucle pour que cela fonctionnerait plusieurs fois. Il n'a pas enregistré les temps d'exécution lorsqu'il ne manquait qu'une seule fois.



0
votes

La seule autre approche serait d'utiliser line.remove (0, pos + 1); , mais je pense que la suppression en interne est en train de supprimer plus de complexes puis de soustruration du fait que la suppression peut également couper quelque chose hors du milieu.

SO SUBSTRING () doit être le FIXES ONE.


0 commentaires

0
votes

Vous pouvez convertir votre chaîne en xName et obtenir la section Nom comme suit. XXX


1 commentaires

intéressant, peut être capable d'utiliser cela ailleurs, mais dans cet exemple, il le rend environ 3 fois plus lent



1
votes

Êtes-vous sûr que c'est un goulot d'étranglement dans votre code? Quelle est votre spécification pour les exigences temporelles de cette méthode? Avez-vous profilé le code que vous avez maintenant à voir si cela répond à ces spécifications?

Je devinerais que le code que vous avez est presque optimal. Les deux indexofofofof et SUBSTRIND INVOKE DANGE CODE Pour effectuer toutes sortes d'optimisations de fantaisie qui ne seront pas disponibles pour vous, sauf si vous allez également aller au dangereux itinéraire. Si vous faites cela, vous allez simplement finir par la réécriture indexof et sous-chaîne de toute façon.

Donc, à moins que ce code ne soit définitivement un goulot d'étranglement de votre code et que vous avez une spécification raisonnable des exigences de temps pour cette méthode, je concentrerais vos efforts ailleurs.


0 commentaires

0
votes
line.Substring(line.IndexOf('}') + 1);
Marginally faster.

0 commentaires