2010-06-06 20 views
15

ich dies mit:Wie füllt man Byte-Array mit Müll?

byte[] buffer = new byte[10240]; 

Wie ich verstehe dies die Puffer-Array von 10kb mit 0s gefüllt initialisieren.

Was ist der schnellste Weg, um dieses Array jedes Mal mit Junk-Daten zu füllen (oder zu initialisieren)?

Ich brauche dieses Array wie> 5000 mal und fülle es jedes Mal mit verschiedenen Junk-Daten, deshalb suche ich nach einer schnellen Methode, es zu tun. Die Array-Größe muss sich auch jedes Mal ändern.

+6

Haben die Junk-Daten zufällig zu sein brauchen ? Oder einfach jedes Mal anders? –

+0

Bitte kopieren Sie keine Tags ("C#") im Titel. Verwenden Sie "csharp" auch nicht als Tag. Die Tatsache, dass es nur in 4 Fragen verwendet wird, sollte ein Hinweis darauf sein, es nicht zu benutzen. –

Antwort

10

Wenn Sie zufrieden sind mit den Daten zufällig sind, sondern bilden einen Zufallsstartpuffer erstellt wird, dann könnten Sie wie folgt vorgehen:

public class RandomBufferGenerator 
{ 
    private readonly Random _random = new Random(); 
    private readonly byte[] _seedBuffer; 

    public RandomBufferGenerator(int maxBufferSize) 
    { 
     _seedBuffer = new byte[maxBufferSize]; 

     _random.NextBytes(_seedBuffer); 
    } 

    public byte[] GenerateBufferFromSeed(int size) 
    { 
     int randomWindow = _random.Next(0, size); 

     byte[] buffer = new byte[size]; 

     Buffer.BlockCopy(_seedBuffer, randomWindow, buffer, 0, size - randomWindow); 
     Buffer.BlockCopy(_seedBuffer, 0, buffer, size - randomWindow, randomWindow); 

     return buffer; 
    } 
} 

ich es ca. 60-70 mal schneller als zu erzeugen erwiesen ein zufälliger Puffer von Grund auf neu.

   START: From seed buffer. 
00:00:00.009 END : From seed buffer. (Items = 5,000; Per Second = 500,776.20) 
       START: From scratch. 
00:00:00.604 END : From scratch. (Items = 5,000; Per Second = 8,276.95) 

aktualisieren

Die allgemeine Idee einmal eine RandomBufferGenerator zu schaffen, und dann diese Instanz verwenden, um Zufalls Puffer zu erzeugen, zB:

RandomBufferGenerator generator = new RandomBufferGenerator(MaxBufferSize); 

byte[] randomBuffer1 = generator.GenerateBufferFromSeed(10 * 1024); 
byte[] randomBuffer2 = generator.GenerateBufferFromSeed(5 * 1024); 
... 
+0

Ich verstehe, dass, um diesen Code zu verwenden, ich tun sollte: RandomBufferGenerator bufferGenerator = neue RandomBufferGenerator (1024); byte [] Puffer = pufferGenerator.GenerateBufferFromSeed (1024); Aber sollte ich immer eine RandomBufferGenerator-Instanz erstellen? Können Sie mir ein Beispiel geben, wie man es benutzt? Vielen Dank. – flyout

+0

Ja, erstellen Sie den RandomBufferGenerator einmal und verwenden Sie dann diese Instanz, um Ihre Puffer zu generieren. Ich habe die Antwort mit einer Beispielverwendung aktualisiert. –

+5

Verwenden Sie niemals diesen Code: 'new Random (DateTime.Now.Millisecond)' - Wenn Sie einfach 'new Random' verwenden, wird der Wert automatisch auf den aktuellen Tick (100 Nanosekunden) von' Environment.TickCount' gesetzt. In Ihrem Code würden alle Zufallszahlen, die in derselben Millisekunde instanziiert werden, denselben Ursprung haben, so dass sie die gleichen Zahlen erzeugen und in diesem Zeitrahmen können Tausende erzeugt werden. Es ist einfach keine gute Übung. –

33

Answering ‚der schnellste Weg‘ ist unmöglich, ohne zu beschreiben, was die Eigenschaften Ihrer Junk-Daten sein. Warum sind nicht nur Nullen gültige Junk-Daten?

Das heißt, das ist eine schnelle Möglichkeit, Ihr Array mit bedeutungslosen Zahlen zu füllen.

Random r = new Random(); 
r.NextBytes(buffer); 

Vielleicht haben Sie auch sehen Sie Ihre eigene Linear congruential generator wenn Random bei der Umsetzung nicht schnell genug für Sie. Sie sind einfach zu implementieren und schnell, geben aber keine qualitativ hochwertigen Zufallszahlen. (Es ist mir unklar, ob Sie diese benötigen oder nicht.)

1

Wie Junky sollten die Daten sein? Meinst du zufällig? Wenn dies der Fall ist, verwenden Sie einfach die Klasse Random.

+0

Ja ich meine zufällige Daten, NextBytes sieht gut aus Ich werde es in einer Weile testen, danke an alle für die Antworten. – flyout

3

Als weitere zu berücksichtigende Option wird Marshall.AllocHGlobal nicht verwalteten Speicher zuordnen. Es löscht die Erinnerung nicht aus, man bekommt, was passiert ist, also ist es sehr schnell. Natürlich müssen Sie jetzt mit diesem Speicher arbeiten, indem Sie unsicheren Code verwenden, und wenn Sie ihn in den verwalteten Bereich ziehen müssen, sind Sie besser mit Random.NextBytes.

+0

Oder öffnen Sie ein zufälliges Bild/Datei/die ausführbare Datei und verwenden Sie das einfach als Zufallsdaten. – CodingBarfield

+1

Ich bin mir ziemlich sicher, dass dies das ist, was der OP wirklich verlangt hat. Im Wesentlichen deklariert char * in unsicheren Code, um auf einen nicht initialisierten Speicherbereich zu zeigen, der mit dem gefüllt ist, was zuletzt da war. –

Verwandte Themen