in reply to Re^2: Optimizing a Text Canvas: An inner loop and a cloner
in thread Optimizing a Text Canvas: An inner loop and a cloner

Sure. Assuming that the U/BOLD/BLINK attributes are 0/1 and that you've already converted your colors into integers (0-255) and copied all of your attribute settings into scalars (which you won't really want to do, but it simplifies the example), I would use:
$current_attribs = $as_bg + $as_fg << 8 + $as_u << 16 + $as_bold << 17 + + $as_blink << 18;
This turns the full set of attributes into a 19-bit integer, allowing the CPU to compare two sets of attributes in a single operation when you check whether $current_attribs == $last_attribs. (They could be rendered into only 9 bits by taking the colors down into the 0-7 range (3 bits each instead of 8), but it would add a little time to do the conversion without saving any work later on.)

Replies are listed 'Best First'.
Re^4: Optimizing a Text Canvas: An inner loop and a cloner
by dsheroh (Monsignor) on Jul 06, 2007 at 17:51 UTC
    (In response to chatterbox questions...)

    To get the data back out from the bitfield, shift back to the right and use a logical bitwise AND to extract the relevant bits:

    $as_bg = $attribs & 255; $as_fg = $attribs >> 8 & 255; $as_u = $attribs >> 16 & 1; $as_bold = $attribs >> 17 & 1; $as_blink = $attrib >> 18 & 1;

    update: Corrected && to &.

Re^4: Optimizing a Text Canvas: An inner loop and a cloner
by JosiahBryan (Novice) on Jul 06, 2007 at 16:10 UTC

    Ahhhh...the lightbulb lites...I think I've got the idea. I'll play with it right now and see what I can come up with. (Many thanks for your help and patience.)