Folgende - nicht so seltene Problem - wurde in dclc im Nov 2001 aufgeworfen. Nach einer kurzen Diskussion hat Hans Eder die beiden Hauptvarianten implementiert und mir den Code und seine Benchmark-Ergebnisse zugeschickt und die Verwendung hier zugelassen. -- HelmutLeitner
Der OP hat TrueColorBilder und möchte auf Grund der RGB-Werte eine ja-nein Entscheidung möglichst effizient durchführen. Die konkrete Aufgabenstellung wurde noch nicht genannt, aber die gleiche Situation wäre bei einer Umwandlung TrueColorBilder -> MonoChromBilder? gegeben (ähnliche Aufgabenstellungen ergeben sich auch bei der Umwandlung in Bilder mit Farbpaletten).
Der auf der Hand liegende Lösungsansatz besteht darin, die Berechnung nicht für jedes einzelne Pixel durchzuführen, sondern TabellenStattBerechnungen zu verwenden. Offen sind die Fragen nach der optimalen Repräsentation dieser Tabellen und der bestmöglichen Performance. Siehe auch SpeicherplatzFürPerformance.
Variante 1: Bit-Array simulieren
Es gibt genug leicht verfügbaren Code um einen Bit-Array der Dimension 2^24 zu simulieren (z.B. www.snippets.org). Natürlich kostet die Positionsberechnung und der Zugriff auf das Einzelbit ein wenig Rechenzeit.
Vorteile:
Variante 2: Char-Array und Reduktion der Auflösung
Man kann meist auf einen Teil der Präzision in der Einzelfarbe (1-3 Bit) verzichten (z.B. durch r>>=2; g>>=2; b>>=2) und dann mit einem normalen komfortablen Array:
|
arbeiten.
Vorteile:
|
Anmerkung 1: Die Schleifendurchläufe sind nur als qualitatives Maß für die Geschwindigkeit zu sehen, weil oben der - allerdings nicht sehr große - Schleifenoverhead mitgemessen wurden.
Anmerkung 2: Das Mischen der Bits in der Variante 2 ergibt eine geringfügige Verbesserung der Performance, vermutlich auf Grund der von Frank Klemm ins Spiel gebrachten besseren "Lokalität" der Zugriffe!? Eine vereinfachte Variante mit konventioneller Bitanordnung ist interessanterweise um einige Prozent langsamer.
Anmerkung 3: Die Ergebnisse könne teilweise stark vom Prozessor abhängig sein. Auf einem 750 MHz Athlon / Win98 / Borland C 5.0x war das Verhältnis ca. 18000:12000 Schleifendurchläufe in den gleichen 2 Sekunden.