The Old New Thing

When is x/2 different from x>>1?

Everyone "knows" that the following pairs of expressions are equivalent: Too bad they aren't. In the C language standard, there is no requirement that the internal representation of signed integers be two's complement. All the permissible representations agree for positive numbers, but negative numbers can have different representations. If...

The effect of SetCursor lasts only until the next SetCursor

Of course the effect of the function for a thread lasts only until that thread changes the cursor to something else. Any moron knows that, right? The tricky part is that the may come from an unexpected place. THe most common place people run into this is when they do something like this: This puts up the hourglass during the ...

Understanding ternary raster operations

It's perfectly logical, which doesn't mean that it's easy to understand. A ternary raster operation describes how three boolean values should combine to form an output boolean. I was going to write up a description but found that the existing documentation pretty much covers it, so I refer you to that. In particular, look at the table that ...

When is a window visible yet not visible?

Today, a quick puzzler. Consider the following code fragment: We just showed the window, certainly it is visible, right? Yet the assertion can fire (even in the absence of multi-threading). Why? Answer below - stop reading if you want to try to solve it yourself. Take a look at the function. If the specified ...

Loading the dictionary, part 5: Avoiding string copying

Looking at the profile for our program so far, 35% of the CPU time is spent copying strings around. Let's see if we can improve that. The best way to speed up copying strings is not to copy them in the first place. Using a in our structure forces the class to copy the string data, when all we really need to copy is the pointer and size ...

Loading the dictionary, part 4: Character conversion redux

Getting rid of was a big help, but 480ms is still not quite peppy enough. You need to respond to user actions within a tenth of a second for thing to seem responsive. Profiling the latest endeavor reveals that 40% of our CPU time is spent in . Some debugging reveals that ultimately calls but uses it to convert only one or two ...

Loading the dictionary, part 3: Breaking the text into lines

Even after moving the character conversion out of the function, profiling reveals that is still taking nearly 50% of our CPU. The fastest code is code that isn't there, so let's get rid of altogether. Oh wait, we still need to break the file into lines. But maybe we can break the file into lines faster than did. This very simple class...

Loading the dictionary, part 2: Character conversion

When you want to optimize a program, you first need to know where the time is being spent. There's no point optimizing a function that isn't actually responsible for your poor performance. For example, if a particular function is responsible for 2% of your CPU time, then even if you optimized it down to infinite speed, your program would...

Loading the dictionary, part 1: Starting point

The first thing we'll need to do in our little dictionary program is to load the dictionary into memory. The format of the dictionary file is as a plain text file, each line of which is of the form Since it was the Big5 dictionary we downloaded, the Chinese characters are in Big5 format, known to Windows as code page 950. Our program will...