Die Performance von Random UUID-Generierung mit Java 7 oder Java 6
Ich habe eine web-basierte Java-Anwendung, die generiert zufällige UUIDs für die session-Informationen. Einer unserer Tester ist zu fordern, bis zu 350ms auf UUIDs basieren auf eigenen Profilierung, aber ich habe noch nicht in der Lage zu replizieren seine Ergebnisse. Er verweist auf diesen Artikel http://www.cowtowncoder.com/blog/archives/2010/10/entry_429.html zu helfen, wieder seine Ergebnisse. Ich wollte sehen, ob jemand anderes hat, lief in dieser Beschränkung mit der Java-built-in Generierung der UUID-Funktion in entweder Java 6 oder Java 7 Anwendungen.
350ms zu generieren, one UUID? Wie wird er sichern, die mit dem Artikel, den Sie verlinken?
Es ist das profiling-tool er nutzt. Ich habe nicht in der Lage zu replizieren, auf meinem Ende noch. Deshalb wollte ich überprüfen, um zu sehen, ob es ein ähnliches problem, jemand anderes erlebt hat. Könnte es ein Problem mit einem profiling-tool oder vielleicht ist es eine seltsame Kombination von Java mit runtime-Umgebung. Es schien seltsam für mich, als gut.
Noch einmal: Hat er Anspruch, dass es dauert 350ms zu generieren, one UUID (wie Sie schreiben UUIDs im plural, ohne wirklich angeben, wie viele)? Wie wird er sichern, die mit dem Artikel, den Sie verlinken? Es gibt nichts in diesem Artikel, was darauf hindeutet, dass die UUID-generator ist so langsam. Eine andere Frage: Welches Betriebssystem ist der tester läuft es testen? Java auf Linux verwendet /dev/urandom generator, der eher langsam, wenn es nicht viel Aktivität (z.B. Benutzereingaben oder Netzwerkverkehr) auf das system.
Der Anspruch war 350ms zum erzeugen einer einzigen UUID. Unsere Standard-Systeme Macbook pro mit Mountain Lion. Produktions-Systeme sind die neueste version von CentOS.
350ms? Ich machte eins in C, erzeugt der 400.000-UUIDs eine Sekunde auf einem neueren macbook pro. Aber das ist nicht wirklich ein fairer Vergleich 😉
Es ist das profiling-tool er nutzt. Ich habe nicht in der Lage zu replizieren, auf meinem Ende noch. Deshalb wollte ich überprüfen, um zu sehen, ob es ein ähnliches problem, jemand anderes erlebt hat. Könnte es ein Problem mit einem profiling-tool oder vielleicht ist es eine seltsame Kombination von Java mit runtime-Umgebung. Es schien seltsam für mich, als gut.
Noch einmal: Hat er Anspruch, dass es dauert 350ms zu generieren, one UUID (wie Sie schreiben UUIDs im plural, ohne wirklich angeben, wie viele)? Wie wird er sichern, die mit dem Artikel, den Sie verlinken? Es gibt nichts in diesem Artikel, was darauf hindeutet, dass die UUID-generator ist so langsam. Eine andere Frage: Welches Betriebssystem ist der tester läuft es testen? Java auf Linux verwendet /dev/urandom generator, der eher langsam, wenn es nicht viel Aktivität (z.B. Benutzereingaben oder Netzwerkverkehr) auf das system.
Der Anspruch war 350ms zum erzeugen einer einzigen UUID. Unsere Standard-Systeme Macbook pro mit Mountain Lion. Produktions-Systeme sind die neueste version von CentOS.
350ms? Ich machte eins in C, erzeugt der 400.000-UUIDs eine Sekunde auf einem neueren macbook pro. Aber das ist nicht wirklich ein fairer Vergleich 😉
InformationsquelleAutor Shawn H | 2013-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Getestet habe ich es
auf meinem PC ~1100 ms, das ist ziemlich langsam. UUID.randomUUID() verwendet SecureRandom intern, es schneller zu machen, wir können mit dem üblichen java.util.Random
es ist ~80 ms
Von mir die Geschwindigkeit der beiden Methoden ist vergleichbar, aber es ist der Windows-Maschine.
Es nutzt SecureRandom für einen Grund, Sie sollte nicht "verwenden von regulären java.util.Random", und nicht erwarten, dass die UUID Auseinandersetzungen.
Ich bin nicht sicher, ob deine Argumentation richtig ist. Ich denke das große Problem ist die Vorhersagbarkeit, nicht Homogenität. UUID ' s verwendet werden könnten, für die sichere Nutzung --als unguessable Schlüssel--, das erfordert eine hohe Qualität der Entropie. Aber in vielen Fällen, wo das Ziel ist, eine unsichere Vermeidung von Kollision, glaube ich, die
random.nextLong()
Strategie ausreichen wird.Ich bin mir nicht sicher, was du meinst, durch Berechenbarkeit oder der Homogenität. Typ 4 UUID ist im wesentlichen eine 122-bit pseudo-random number generator, wie alle anderen pseudo-Zufallszahlen-Generatoren, die Gefahr der Erzeugung der gleichen Anzahl (Zusammenstöße) hängt weitgehend von Entropie. Auch UUID ' s verwendet werden sollte nicht als unguessable Schlüssel (weil Sie trivial bruteforced) Sie sollte genutzt werden, als Universally Unique IDentifiers, und je mehr von Ihnen, die Sie generieren, desto höher ist die Wahrscheinlichkeit von Zusammenstößen. Vor allem, wenn Sie mit so etwas wie libc.rand für die Entropie.
InformationsquelleAutor Evgeniy Dorofeev
Hier ist ein Testlauf in beta-127.
Beachten Sie, dass dieser test unrealistisch, jenseits aller worst-case-Szenario kann ich mir vorstellen. Mein Ziel war es, ruhig diejenigen, die schlecht über die Verwendung von UUIDs, ohne die Tatsachen zu sichern, Ihre Kritik.
Szenario:
java.util.UUID.randomUUID()
, Ohne Streit
Läuft eine Schleife in einem thread, so dass kein Streit über die synchronisierten Methoden/Klassen.
Ergebnisse
Über 2 Mikrosekunden pro UUID.
Mit Konflikten
Ähnlich wie oben, aber während einer Schleife von einer Millionen Aufrufe, haben wir zwei andere threads, wo jeder macht zehn Millionen Anrufe.
Und die Klasse definieren, in jedem thread...
Ergebnisse
Über 20 Mikrosekunden per UUID.
Läuft mit 14, 20, 20, 23 und 24 Mikrosekunden pro UUID (nicht in dieser Reihenfolge). Also unter extremen Streit, wurde nur etwa 10 mal schlimmer, mit 20 Mikrosekunden als akzeptabel in der realen Nutzung, den ich kenne.
nanos / 1000
Mikro Sekunden nicht milli in Sekunden.Behoben, danke.
InformationsquelleAutor Basil Bourque
Die zufällige form der UUID erfordert eine Quelle von "Kryptographie-Stärke" Zufallszahlen. (Wenn es nicht dann könnte es die Wahrscheinlichkeit, dass eine bestimmte UUID ist neu aufgelegt erhöhen könnte, um sich Gedanken zu machen Ebenen.)
Typische Krypto-Kraft-Zufallszahlen-Generatoren verwenden eine Quelle der Entropie, die von außerhalb der Anwendung. Es könnte ein hardware-Zufallszahlen-generator, aber häufiger ist es angesammelten "Zufälligkeit", die geerntet, indem das Betriebssystem im normalen Betrieb. Das problem ist, dass die Quellen der Entropie haben ein limit. Wenn Sie mehr als diese rate über einen Zeitraum von Zeit, die Sie entwässern können, die Quelle. Was danach passiert ist system abhängig, aber auf manchen Systemen wird der Systemaufruf zum Lesen Entropie wird stall ... bis mehr verfügbar ist.
Ich erwarte, dass ist das, was passiert auf Ihrem client-system.
Einen workaround (für Linux-Systeme) wird jetzt zum installieren der
rngd
daemon und konfigurieren Sie es auf "top up" der Entropie-pool mit einem pseudo-random number generator. Der Nachteil ist, dass dieser Kompromiss könnte Ihre UUID-generator ist die Zufälligkeit.InformationsquelleAutor Stephen C
Die Anzahl der threads, hat einen großen Einfluss auf die Leistung bei der Erzeugung von UUIDs. Dies kann erklärt werden, indem man die Umsetzung von
SecureRandom#nextBytes(byte[]
dem die Zufallszahlen erzeugt, fürUUID.randomUUID()
:nextBytes
istsynchronized
führt zu erheblichen performance-Verlust, wenn der Zugriff von verschiedenen threads.InformationsquelleAutor Peter Keller
Version 1 Statt 4
Wie über die Verwendung der Version 1-Typ UUID?
Version 1 basiert auf MAC-Adresse und die aktuelle Zeit ("Raum und Zeit"). Viel weniger wahrscheinlich, um Kollisionen als Version 4.
Version 4 basiert auf vollständig erzeugt Zufallszahlen mit einem kryptographisch starken Zufallsgenerator.
Die Oracle-JVM nicht eine Version 1 generator, angeblich wegen der Sicherheit und zum Schutz der Privatsphäre. Die JVM hat keinen Zugriff auf die MAC-Adresse der host-Maschine.
KRUG Bibliothek
Gibt es mindestens eine third-party Bibliothek zur Verfügung, die doe bieten Version 1 UUIDs, wie auch die anderen Versionen: JUG – Java-UUID-Generator. Sie sagen features von Java 6 lassen Sie Sie bekommen Zugriff auf die MAC-Adresse.
Test-Ergebnisse: 20x
Lesen Sie eine Diskussion der Leistung mit test-Ergebnisse mit Java UUID Generator version 3 in der 2010-Artikel Mehr auf Java-UUID-Generator (JUG), ein Wort, auf performance. Tatu Saloranta getestet verschiedene Arten von Uuid auf seinem MacBook.
Fazit: MAC+Zeit-version ist 20 mal schneller, die zufällige version.
InformationsquelleAutor Basil Bourque
Einem junit Testlauf unter jdk 1.7.0_40:
Und die Ergebnisse auf meinem i5 laptop waren:
0.0006770 ms pro Aufruf.
UUID.randomUUID();
Linie als deren Ergebnisse nicht genutzt?InformationsquelleAutor CorbaTheGeek
Habe ich den gleichen test wie die anderen und meine Ergebnisse sind mehr wie 300 Nanosekunden pro UUID generation. Die Ergebnisse sind auf einem i7-quad-core WIN7 64 PC. Ich habe versucht, mit einem jdk1.7.0_67 und mit einem jdk1.8.0_40 64 bit JVMs.
Bin ich ein bisschen perplex, meine Ergebnisse sind so anders als alle anderen... Aber 1 ms für die Generierung einer Zufallszahl schien eine MENGE !
Die Ausgabe :
InformationsquelleAutor yannick1976