The number of Win32 implementations the application designer might be considering is growing. At present these consist of Windows NT and Win32s. As you certainly know by now, Win32s is implemented on top of 16-bit Windows so that Win32s applications can gain the benefits of a 32-bit address space, but still execute on existing 16-bit Windows systems. The existence of these two flavors of the Win32 API complicates the design decisions for the application programmer primarily in the performance arena. This is because Win32s offers the application the advantages of the 32-bit address space, but continues to be subject to the internal restrictions of 16-bit Windows (and to some extent, MS-DOS).
Therefore optimizations made for Windows NT will not always port to Win32s, and vice versa. Here we'll summarize which optimizations apply to which Win32 implementations.
The following table lists the various optimizations and tools presented in this chapter, and indicates where they apply. (Many of the tools listed at the end of the table are discussed in Chapter 10, "Tuning Windows NT Applications," and Chapter 11, "Tuning the Working Set of Your Application.") The abbreviations used in the table are:
Yes | OK to use in this implementation |
N/A | Not applicable, does not apply to Win32s |
No-op | You can do this without effect on Win32s |
No | No, don't do this on Win32s |
Optimization | Windows NT | Win32s |
Kernel optimizations: | ||
Large address space | Yes | Yes |
Discard old custom virtual memory schemes | Yes | Yes |
Use memory-mapped files for file access | Yes | Yes |
Reserve large data address spaces, but commit only what you need | Yes | Yes |
Use named shared virtual memory | Yes | Yes |
For sequential I/O, use 4K or 8K blocks | Yes | Yes |
Use threads to enhance concurrency | Yes | No |
Keep files open | Yes | No |
Global and Local allocation are the same | Yes | No |
Real-time priority for data communications | Yes | No |
Page-Locking API is provided | Yes | Yes |
Use new data type MULTI_SZ in Registry | Yes | No |
Write the application using Unicode | Yes | No |
No disk cache tuning required | Yes | No |
Graphics: | ||
Client-server protection dominates | Yes | N/A |
Batching of calls amortizes cost | Yes | N/A |
Caching of values on client side reduces cost | Yes | N/A |
Mapping of server data read-only to client | Yes | N/A |
Batch output functions that return a Boolean result | Yes | N/A |
SetPixelV and MoveToEx are batched | Yes | No-op |
New APIs Gdi{Get|Set}BatchLimit, GdiFlush help | Yes | No-op |
Set batch limit as high as possible while avoiding jerky display | Yes | No-op |
Most "user" (that is, Windows management) calls flush the batch | Yes | No-op |
GDI calls that return a number or a handle flush the batch | Yes | No-op |
Selecting fonts, brushes, and pens do not flush the batch | Yes | No-op |
Selecting bitmaps and regions flush the batch | Yes | No-op |
SetWorldTransform and SetMapMode flush the batch | Yes | No-op |
GdiSetBatchLimit(1) only to see errors, or | Yes | No-op |
GdiSetBatchLimit(1) only to profile API calls | Yes | No-op |
Use new Poly calls as much as possible | Yes | Yes |
Avoid Create, Select, Use, Select former, Destroy | Yes | No |
Create, Create, Create; Select and Use, Use, Use... | Yes | No |
Richer structures to hold unlimited objects | Yes | N/A |
Group attribute usage: gray, gray, gray, red, red | Yes | Yes |
Grouping avoids cache lookup for pens, fonts, colors, palettes, brushes | Yes | Yes |
Use CS_OWNDC in RegisterClass | Yes | No |
CreateWindow, Get(Own)DC set DC attributes only once | Yes | No |
Timers are no longer precious | Yes | No |
Less need to use PeekMessage frequently | Yes | No |
Write to Unicode | Yes | No |
RISC: | ||
Be sure to align data | Yes | No |
Compiler pragma for handling file/net data | Yes | Yes |
Exception handling for data alignment not supported | varies | N/A |
Tools: | ||
Win32 API Profiler | Yes | Yes1 |
Win32 Call/Attributed Profiler | Yes | No |
Working Set Tuner | Yes | 2 |
VADump | Yes | 2 |
PView | Yes | No |
Debugger wt command | Yes | No |
Performance Monitor | Yes | No |
1 There are two Win32 API Profilers: one for Windows NT, and another for Win32s.
2 Working set tuning done on Windows NT will apply without further effort to the same application running on Win32s.