wieso immer auf bits achten?
-
@thordk:
Auf > 90% der Fälle bezogen wird das wohl stimmen. Es gibt aber auch gute Gründe bits & bytes zu sparen.
Wenn man wirklich wirklich viele 1 Bit Variablen (bools eben) braucht dann macht das immerhin nen Unterschied Faktor 8. Und z.B. 1GB Speicherverbrauch ist halt schon ganz was anderes als 8GB...
-
wobei "wirklich viele" irgendwo im bereich von einer paar dutzend millionen primitiven typen anzusiedeln ist. und es gibt nicht viele bereiche, in denen so große datenmengen gleichzeitig im speicher gehalten werden müssen.
und andersrum: wenn man mit so riesigen datenmengen arbeitet, dann ist man meisst sogar besser bedient, wenn man built-ins benutzt und nicht irgendwelche eigenen varianten oder versucht, einzelne bits durch die register zu schieben.
dass man sich also gedanken über sowas machen muss, kommt nur in extrem wenigen fällen vor.
-
Obwohl man dazu sagen muss, dass es so groß eher selten ausfallen wird. Aber wenn du z.B. eine Klasse in deinem Spiel hast, die 16 Bools enthalten (Spieler tot, Spieler aktiv, etc.) und dein Spiel ca. 5.000 Leute spielen, du also min. 5.000 Charaktere hast, dann hast du in diesem Fall ohne diese Methode 16x5.000 Byte = 80.000 Byte Speicherbedarf. Wenn du die Bools aber als 1-Bit Bool anlegst, dann werden daraus 16x5.000 Bit = 80.000 Bit = 10.000 Byte. Du hast also nur 1/8 des Speicherbedarfs.
EDIT: Der Beitrag ist auf hustbaer bezogen. thordk war bloß schneller.
-
und wen juckts, ob 10kb oder 80kb verbraucht werden?

wenn du die daten jetzt z.b. über ein netzwerk jagen willst, dann kannst du sie dafür durch deine transportschicht jagen, die sie vorm versenden eintütet (1-bit pro bool) und beim empfänger wieder in ein einfach handhabbares pod umwandelt (8-bit bools). keep it simple.
-
BitWax schrieb:
Obwohl man dazu sagen muss, dass es so groß eher selten ausfallen wird. Aber wenn du z.B. eine Klasse in deinem Spiel hast, die 16 Bools enthalten (Spieler tot, Spieler aktiv, etc.) und dein Spiel ca. 5.000 Leute spielen, du also min. 5.000 Charaktere hast, dann hast du in diesem Fall ohne diese Methode 16x5.000 Byte = 80.000 Byte Speicherbedarf. Wenn du die Bools aber als 1-Bit Bool anlegst, dann werden daraus 16x5.000 Bit = 80.000 Bit = 10.000 Byte. Du hast also nur 1/8 des Speicherbedarfs.
EDIT: Der Beitrag ist auf hustbaer bezogen. thordk war bloß schneller.
Die Rechnung zeigt sehr schön, dass es eigentlich egal ist. Was machen denn ein paar 1000 Bytes aus, wenn man in nem Spiel Grafiken mit mehreren MB hat.
-
Es geht auch um den Arbeitsspeicher.
@thordk: Keep it Simple? mit deiner Methode Do it the most tricky way!
-
Simpel und einfach einen std::vector<bool> verwenden, der machts schon automatisch und man bekommt als Programmierer davon nicht mal was mit, außer, dass das Programm ein bisschen langamer wird.
-
Naja, also im Endeffekt ist das sowieso Geschmackssache. Ich bevorzuge es auch, die Bits zu beschränken, anstatt alles unnötig aufzuplustern.
-
BitWax schrieb:
Es geht auch um den Arbeitsspeicher.
was sonst?
-
eigentlich ist es dumm zu sagen, man muss immer auf die bits achten. Bei den meisten Windowsanwendungen ist es egal. Und wenn man nen Spezialfall hat, dann muss man halt auf einzelne bits achten. Es kommt halt immer auf den Fall drauf an und nur zu sagen immer so oder so ist richtig ist dumm.
-
BitWax schrieb:
Naja, also im Endeffekt ist das sowieso Geschmackssache.
???2 schrieb:
was sonst?
Ich wollte es nur nochmal sagen.
-
BitWax schrieb:
Naja, also im Endeffekt ist das sowieso Geschmackssache.
Nö
-
Doch! Oder gibt es Nachteile?
-
wenn immer maskiert werden muss wird es langsamer.
-
Man sollte erst dann von Hand optimieren, wenn man festgestellt hat, dass dieser Teil des Programms der Flaschenhals ist.
Also erst dann Bits sparen, wenn nachweißlich dieser Teil den größten Anteil am Speicher verbraucht. Bei dem Serverbeispiel machen die 70kb Ersparnis keinen Unterschied, wenn der Server tatsächlich so viel Speicher verbraucht, dass man sich um eine Ersparnis Gedanken machen muss, dann verbraucht offensichtlich ein anderer Teil des Servers erheblich mehr Speicher und folglich sollte man sich darum bemühen an dieser Stelle Speicher einzusparen.
Beim Sparen von Speicher sollte man so vorgehen wie auch beim Sparen von CPU-Zeit: erst messen ob es auch wirklich einen Nutzen bringt.
-
ab welcher grösse es anfängt interessant zu werden hängt einfach davon ab wo die nächste relevante grenze überschritten wird.
wenn man z.B. einen lookup-table in einer sehr engen schleife verwendet kann es sinn machen ein paar befehle zum shiften & maskieren mehr zu verbrauchen wenn der table dadurch wieder so klein wird dass er komplett in den cache passt.
wenn man primzahlen siebt und das maximum rausholen will macht es auch sinn einzelne bits zu adressieren statt gleich ein byte für ein bit zu verbraten.
...
dass die aussage (sinngemäss) "bits sparen ist doof" IMO auf > 90% aller fälle zutrifft habe ich schon geschrieben.