So, I ran some tests
and got puzzling (well, puzzling to me) results. All tests were run as such:
For each pair (method, buffer_size) in a time-restricted loop (4 seconds for each pair) I was issuing (and counting number of) synchronous DeviceIoControl calls to my test driver (no verifier attached). For each IOCTL both, in and out buffers had same size (buffer_size) and both were page-aligned. In the driver, for NEITHER method I create MDL, lock it and get mapped system address. After that (and in BUFFERED case starting with this) I just complete IRP with IO_STATUS.Information set to IOCTL’s input buffer length. So, there is no data copy is involved, just pure minimal overhead calculation. Result was sort of expected with one puzzling exception: a sudden (and significant) drop in BUFFERED method performance around 1.5K – 3.5K buffer size region. This drop is pretty much consistent. No matter how many times I run the test, it’s always there at least for one buffer size from this range. The machine I ran this test is HT single CPU with 3G of memory. Probably, I should Kernrate that test to get an idea where is the source for the drop, but before starting that extra work, I’d rather ask the experts
So, does anybody have an idea why I see what I see?
Here are the stats that I collected:
Method: BUFFERED, Buffer size = 6144, Requests 336257, Rate = 84 req / msec
Method: NEITHER, Buffer size = 6144, Requests 387828, Rate = 96 req / msec
Method: BUFFERED, Buffer size = 5632, Requests 341320, Rate = 85 req / msec
Method: NEITHER, Buffer size = 5632, Requests 387961, Rate = 96 req / msec
Method: BUFFERED, Buffer size = 5120, Requests 341749, Rate = 85 req / msec
Method: NEITHER, Buffer size = 5120, Requests 387452, Rate = 96 req / msec
Method: BUFFERED, Buffer size = 4608, Requests 345939, Rate = 86 req / msec
Method: NEITHER, Buffer size = 4608, Requests 389834, Rate = 97 req / msec
Method: BUFFERED, Buffer size = 4096, Requests 350218, Rate = 87 req / msec
Method: NEITHER, Buffer size = 4096, Requests 402132, Rate = 100 req / msec
Method: BUFFERED, Buffer size = 3584, Requests 380733, Rate = 95 req / msec
Method: NEITHER, Buffer size = 3584, Requests 400632, Rate = 100 req / msec
Method: BUFFERED, Buffer size = 3072, Requests 110274, Rate = 27 req / msec
Method: NEITHER, Buffer size = 3072, Requests 400716, Rate = 100 req / msec
Method: BUFFERED, Buffer size = 2560, Requests 122674, Rate = 30 req / msec
Method: NEITHER, Buffer size = 2560, Requests 402039, Rate = 100 req / msec
Method: BUFFERED, Buffer size = 2048, Requests 123675, Rate = 30 req / msec
Method: NEITHER, Buffer size = 2048, Requests 400389, Rate = 100 req / msec
Method: BUFFERED, Buffer size = 1536, Requests 420653, Rate = 105 req / msec
Method: NEITHER, Buffer size = 1536, Requests 402658, Rate = 100 req / msec
Method: BUFFERED, Buffer size = 1024, Requests 431754, Rate = 107 req / msec
Method: NEITHER, Buffer size = 1024, Requests 402271, Rate = 100 req / msec
Method: BUFFERED, Buffer size = 512, Requests 457249, Rate = 114 req / msec
Method: NEITHER, Buffer size = 512, Requests 402445, Rate = 100 req / msec