Ich habe versucht, die Zeichen in einem Kreditkartennummernstring mit dem Zeichen 'X' zu maskieren. Ich schrieb zwei Funktionen wie folgt. Die zweite Funktion verwendet commons.lang.StringUtils
class. Ich habe versucht, die Zeit in beiden Fällen zu finden
Als ich das ausgeführt habe, habe ich dieses Ergebnis erhalten
%Vor%Ich kann nicht verstehen, warum commons.StringUtils mehr Zeit in Anspruch nimmt als die for-Schleife + StringBuffer in der ersten Funktion. Offensichtlich benutze ich die api, die falsche Art.
Kann jemand in diesem Fall sagen, wie man diese API richtig benutzt?
Erstens, wenn Sie Messungen eines solchen kurzen Codes durchführen, erhalten Sie oft keine genauen Ergebnisse aufgrund der minimalen Timing-Auflösung, die Ihre CPU / Bibliothek / was auch immer bietet (was bedeutet, dass Sie normalerweise 0ms oder die gleichen kleinen sehen) Wert immer und immer wieder).
Zweitens und noch wichtiger, optimieren Sie das nicht! "Vorzeitige Optimierung ist die Wurzel allen Übels" und in einem Fall, in dem Sie nur wenige ms haben, die Sie optimieren möchten, wird der Aufwand gründlich verschwendet. Sie müssten Millionen von Kreditkarten maskieren, bevor Sie im Entferntesten darüber nachdenken sollten, diese einfache Maskenmethode zu optimieren.
Wahrscheinlich ist dies der Zeitpunkt, zu dem StringUtils
aus der Datei apache-commons.jar
geladen wird. Nicht die tatsächliche Ausführungszeit.
Um die tatsächliche Ausführungszeit zu berechnen, versuchen Sie mehrmals zu laufen und sehen Sie, wie viel ms der zweite ist. 3. bis 100. wird dauern.
Jedenfalls wird, wie Frank sagte, eine Optimierung auf dieses Niveau nicht empfohlen.
String utils kopiert die Zeichenfolge wahrscheinlich einige Male. zum Beispiel, wenn Sie gepolstert.concat (Ende) ausführen; Der jvm weist eine neue Zeichenfolge mit der Größe der beiden Concat-Zeichenfolgen zu und kopiert sie. Wenn Sie StringBuffer verwenden, speichern Sie alle diese Kopien, da der Puffer bereits einen Platz zugewiesen hat und der kopierte String dort kopiert wurde. Sinn machen für mich, dass der StringBuffer zwar schneller ist, die gemessene Zeit aber ziemlich groß erscheint, würde ich erwarten.
Obwohl weniger lesbar, können Sie dies tun
%Vor%Die Verwendung von Google Caliper auf meinem Computer würde etwa 20-25 ns im Vergleich zu mehr als 100 ns mit StringBuilder oder StringUtils.overlay + repeat Annäherungen ergeben.
%Vor%Ich weiß, das ist keine Antwort, aber Sie können regulären Ausdruck verwenden und dies in einem Schritt lösen
%Vor%Erläuterung:
Tags und Links java masking apache-commons-lang