Nun, es ist ein großes Buch zu diesem Thema: Hacker Delight (Google Bücher)
Auf Amazon.com. Hacker Delight
Kürzlich entdeckte ich, dass, wenn ich sehen muss, ob die Variable gerade (oder ungerade) ist, ich einfach sehen könnte, ob das letzte Bit der Variablen gleich 0 ist. Diese Entdeckung, wenn implementiert, ersetzt wenige modulo 2 Berechnungen und damit ganze Funktion lief schneller.
Gibt es noch andere "Tricks" wie diese, bei denen das Arbeiten mit Bits andere Berechnungen ersetzen könnte, was zu einer verbesserten Ausführungszeit der Funktionen führt?
Ich bezweifle, dass das Ersetzen der Verwendung von Modulo-Zwei-Berechnungen durch die äquivalente bitweise Operation schnellere Ausführungszeiten erzeugte. Jeder C ++ - Compiler, der seinen Kern wert ist, kompiliert n % 2
und n & 1
zu identischen Maschinenbefehlen.
Vorsicht vor Bit-Twiddling-Hacks als Optimierung. Erstens ist es nicht immer klar, dass die Funktion, die Sie optimieren, ein Flaschenhals ist. Zweitens ist der resultierende Code in der Regel schwieriger zu warten und wahrscheinlicher, dass er inkorrekt ist oder geringfügige Fehler aufweist. Das ist es, was im berühmten Sprichwort von Knuth gemeint ist. "Wir sollten kleine Wirkungsgrade vergessen, sagen wir in 97% der Fälle: vorzeitige Optimierung ist die Wurzel allen Übels." Spare deine Mühe.
Wenn Sie dieses Thema wirklich verfolgen müssen, Bit Twiddling Hacks enthält eine schöne Liste interessanter Hacks .
Nun, es ist ein großes Buch zu diesem Thema: Hacker Delight (Google Bücher)
Auf Amazon.com. Hacker Delight
Es gibt viele. Eine Online-Sammlung, mit der Sie beginnen können, ist Ссылка
Ich würde sehr empfehlen, Bittrick-Tricks im Code zu verwenden, es sei denn, der Leistungsschub ist absolut, definitiv, 100% erforderlich. Diese Tricks sind sehr unlesbar und haben das Gefühl, dass das nicht funktioniert. Wenn Sie also versuchen, einen Fehler zu finden, sind sie effektive Zeitverschwender für jeden, der versucht, den Code zu debuggen.
Es kann nützlich sein, wenn C ++ eine modulo 2
Operation als %2
sieht, optimiert es sich normalerweise, ohne dass Sie bitweise Operationen ausführen.
Während es aufschlussreich wäre, alle diese Tricks zu verstehen, sollte es angenehm sein zu wissen, dass der Compiler (oder der Compiler-Schreiber) hart arbeitet, um alle Optimierungen zu ermöglichen.
Was Sie sich merken sollten, ist, dass wenn Sie Konstanten verwenden und in Zweierpotenzen arbeiten, Optimierungen wahrscheinlicher sind, da die Compiler die binären Operatorfähigkeiten der Maschine nutzen.
Ich würde vorschlagen, mehr darüber zu erfahren, wie Systeme auf niedriger Ebene funktionieren.
Zu diesem Zweck wären Lerntricks, auf die Sie sich beziehen, sehr nützlich .
Allerdings kryptische Codierung mit komplizierten Operationen zusammengestopft
(Zum Beispiel, um alles in weniger Anzahl von Quellcode-Bytes zu machen) ist nicht gut.
Es kann gut sein zu wissen, dass Sie zwei 32-Bit-Variablen "in Place", ohne eine dritte temporäre Variable - mit XOR-Operationen austauschen können. Aber es wäre viel nützlicher zu wissen, dass die Kreuzkompilierung Big-Endian- und Little-Endian-Handling für 2/4 erfordert Byte-Variablen und Bitfelder .
Wenn ich über Bit-Felder spreche, erinnere ich mich an eine andere stackoverflow-Konversation über ihre Popularität . Würde auch gut lesen (obwohl nicht ganz auf Ihre Frage bezogen).
Um es zusammenzufassen, ich bin total bei dir, um zu lernen, welche Tricks gemacht werden können. Ich möchte sie verwenden, um meinen Code besser zu machen - und ich denke, es werden Konzepte wie was Programmierer besser machen können Cache-Optimierung zum Beispiel, um bessere Implementierungen zu ermöglichen.
Hier ist ein netter Trick. Wenn Sie ein Datum in einem Datenbankfeld speichern, das eine umfangreiche Suche erfordert, speichern Sie das Datum nicht im Datumsformat, sondern speichern Sie es als Ganzzahl im Format JJJJMMTT. Datenbanken können Ganzzahlen viel schneller durchsuchen als Datumsstrukturen.
Ich dachte, "Bitwise Flags" waren beim ersten Mal recht ordentlich: Ссылка
Tags und Links c++ bit-manipulation