Es gibt also verschiedene Möglichkeiten, einen zufälligen Bool in C # zu erstellen:
- Verwenden von Random.Next ():
rand.Next(2) == 0
- Verwenden von Random.NextDouble ():
rand.NextDouble() > 0.5
Gibt es wirklich einen Unterschied? Wenn ja, welches hat tatsächlich die bessere Leistung? Oder gibt es einen anderen Weg, den ich nicht gesehen habe, der vielleicht noch schneller ist?
c#
performance
random
boolean
timedt
quelle
quelle
NextBytes
ein Byte-Array vorab zuBitArray
füllen, es in eine Sammlung von Booleschen Werten umzuwandeln und diese Booleschen Werte von a abzurufen,Queue
bis es geleert ist, und dann zu wiederholen der Prozess. Bei dieser Methode verwenden Sie den Randomizer nur einmal, sodass der dadurch entstehende Overhead nur auftritt, wenn Sie die Warteschlange wieder auffüllen. Dies kann nützlich sein, wenn es sich um einen sicheren Zufallszahlengenerator handelt und nicht um die reguläreRandom
Klasse.NextBytes
, so dass es überraschend langsam istbuffer[i] = (byte)(this.InternalSample() % 256);
- Ich gehe davon aus, dass Sie darüber sprechen, dass sie diese zufällige Ganzzahl hätten nehmen und in 3 Bytes aufteilen können , das Byte-Array mit etwa 1/3 der Arbeit zu füllen. Ich frage mich, ob es einen Grund dafür gab oder ob es nur ein Versehen der Entwickler war.Antworten:
Die erste Option -
rand.Next(2)
führt hinter den Kulissen den folgenden Code aus:und für die zweite Option -
rand.NextDouble()
:Da die erste Option
maxValue
Validierung, Multiplikation und Casting enthält, ist die zweite Option wahrscheinlich schneller .quelle
Kleine Verbesserung für die zweite Option :
Laut MSDN
kehrt zurück
Wenn Sie also einen gleichmäßig verteilten zufälligen Bool möchten, sollten Sie ihn verwenden
>= 0.5
quelle
Die schnellste. Das Aufrufen der Methode
Random.Next
hat den geringeren Aufwand. Die unten stehende Erweiterungsmethode läuft 20% schneller alsRandom.NextDouble() > 0.5
und 35% schneller alsRandom.Next(2) == 0
.Schneller als der Schnellste.
Random
Mit Tricks ist es möglich, zufällige Boolesche Werte mit der Klasse noch schneller zu generieren . Die 31 signifikanten Bits eines generiertenint
können für 31 nachfolgende boolesche Produktionen verwendet werden. Die unten stehende Implementierung ist 40% schneller als die zuvor als die schnellste deklarierte.quelle
Ich habe Tests mit Stoppuhr durchgeführt. 100.000 Iterationen:
CPUs mögen Ganzzahlen, daher war die Next (2) -Methode schneller. 3.700 gegenüber 7.500 ms, was ziemlich beachtlich ist. Außerdem: Ich denke, Zufallszahlen können ein Engpass sein. Ich habe in Unity ungefähr 50 Frames pro Frame erstellt, selbst mit einer winzigen Szene, die mein System merklich verlangsamt hat. Daher hatte ich gehofft, eine Methode zum Erstellen eines zufälligen Bools zu finden. Also habe ich es auch versucht
Das Aufrufen einer statischen Funktion war mit 9.600 ms jedoch noch langsamer. Einen Versuch wert. Schließlich habe ich den Vergleich übersprungen und nur 100.000 Zufallswerte erstellt, um sicherzustellen, dass der Vergleich zwischen int und double keinen Einfluss auf die verstrichene Zeit hat, aber das Ergebnis war ziemlich gleich.
quelle
DateTime.UtcNow
es ist viel schneller alsDateTime.Now
.