Verknüpfen Sie boost :: dynamic_bitset oder std :: bitset

7

Was ist der beste Weg, um 2 Bitsets zu verketten?

Zum Beispiel habe ich

%Vor%

Sie sollten in einen dritten Bitset-Test3 verkettet werden, der dann

enthält %Vor%

Lösungen sollten boost :: dynamic_bitset verwenden. Wenn die Lösung mit std :: bitset funktioniert, wäre es auch nett. Beim Verketten der Bits sollte der Fokus auf der Leistung liegen.

UPDATE: Ich habe beide Methoden verglichen (stringmethod von mir und Neil und shiftmethod von messenger) und die Stringmethode war viel schneller (Faktor 10 ++). Code hier: Ссылка

Ich hoffe, Pastebin ist in Ordnung, um lange Code-Listings zu veröffentlichen. Wenn es einen besseren Weg gibt, kontaktieren Sie mich bitte.

    
MOnsDaR 17.06.2010, 12:50
quelle

5 Antworten

9

Für das Standard-Bitset etwa:

%Vor%     
anon 17.06.2010, 13:34
quelle
7

Ich habe mehrere Lösungen getestet und es sieht so aus:

  • eine gute alte "for-Schleife" ist die schnellste
  • bitset ist viel schneller als dynamic_bitset (nicht überraschend), wenn keine Speicherzuweisung benötigt wird, ist der Overhead niedriger, aber immer noch vorhanden.
  • Es mag offensichtlich erscheinen, aber ein Bitset direkt an ein anderes anhängen, ohne ein neues zu erstellen, ist schneller. Diese Lösung ist nicht geeignet, wenn Sie den ersten Bitsatz unverändert lassen müssen (offensichtlich).
  • Die 3 Lösungen erzeugen nicht das gleiche Ergebnis, Sie müssen je nach Wunsch etwas abstimmen (siehe unten).

Hier ist mein Testcode:

%Vor%

Hier ist die Ausgabe, die ich mit VS7.1 auf meinem Computer bekomme:

%Vor%

Sie können feststellen, dass die Funktion, die ich mit Loops geschrieben habe, unterschiedliche Ergebnisse liefert. Es ist, weil ich dann geschrieben habe, um das LSB des zweiten Bitsets nach dem MSB des ersten zu setzen (LSB auf der rechten Seite). Mit der Funktion String oder "Bit Operator" müssen Sie nur die Aufrufparameter umschalten.

    
Fericelli 06.09.2012 12:14
quelle
2

Ich habe einen Test durchgeführt, der die folgenden zwei Ansätze vergleicht:

%Vor%

... wobei randomUlongs während jedes Laufs konstant war (ein großes Array in einem Header), um alles zu vermeiden, was die Ergebnisse verunreinigt. Ich habe es mit getaktet:

%Vor%

Unter Linux (x86_i686) mit gcc 4.4.6 auf Optimierungsstufe 3: Die Verkettung der Zeichenkette war um den Faktor 2 am schnellsten.

Unter Solaris (sparc) mit gcc 3.4.3 und Sun Studio C++ 5.12 (2011/11/16) , beide mit Optimierungsstufe 3: Der Non-String-Ansatz war um den Faktor 10 am schnellsten.

Ich denke, Sie werden feststellen, dass die "schnellste" Lösung in hohem Maße vom Compiler abhängt, obwohl ich denke, dass die Plattform auch eine wichtige Rolle spielen könnte.

    
Brian Vandenberg 26.08.2013 23:57
quelle
2

Für den Anfang werde ich eine mögliche Lösung selbst hinzufügen. Der folgende Code verwendet die Möglichkeit, Bitsets mit std :: string zu konstruieren und eine std :: string von einem Bitset zu generieren.

%Vor%

Das funktioniert, aber es muss andere, performantere Lösungen geben ...

Aktualisierung:
Danke an J. C. Leitão für seinen Bearbeitungsvorschlag

    
MOnsDaR 17.06.2010 12:55
quelle
0

Hier ist ein Stich zu einer Lösung. Nicht sicher, ob es kompiliert.

%Vor%     
messenger 17.06.2010 14:08
quelle

Tags und Links