[postgis-devel] Re: Cost of memcmp
Paul Ramsey
pramsey at cleverelephant.ca
Mon Oct 6 22:29:13 PDT 2008
I think I'm convinced that, thought memcmp is a non-zero cost,
compared to the cost of EVERYTHING ELSE, it's a very small cost. (For
example, I calculated, based on the numbers below, that the memcmp
cost of my standard 8000-overlayed-with-80 test data would be about
40ms, and the current code returns results in about 8000ms. So a 0.5%
performance penalty.)
P.
On Mon, Oct 6, 2008 at 10:17 PM, Paul Ramsey <pramsey at cleverelephant.ca> wrote:
> OK, I should have been a bit more skeptical of those results.. the
> compiler optimized the test out of existence. Here's one that returns
> real answers on the cost of memcmp.
>
> First the results though:
>
> 1000000 ticks per second.
> Compared 1024 bytes (~64 vertices), 1000000 times, took 165666 ticks.
> Compared 2048 bytes (~128 vertices), 1000000 times, took 288141 ticks.
> Compared 4096 bytes (~256 vertices), 1000000 times, took 570401 ticks.
> Compared 8192 bytes (~512 vertices), 1000000 times, took 1112775 ticks.
> Compared 16384 bytes (~1024 vertices), 1000000 times, took 2221507 ticks.
> Compared 32768 bytes (~2048 vertices), 1000000 times, took 4781961 ticks.
> Compared 65536 bytes (~4096 vertices), 1000000 times, took 9576764 ticks.
> Compared 131072 bytes (~8192 vertices), 1000000 times, took 19109345 ticks.
> Compared 262144 bytes (~16384 vertices), 1000000 times, took 38152790 ticks.
>
>
> Then the code:
>
> #include <stdio.h>
> #include <string.h>
> #include <stdlib.h>
> #include <time.h>
>
> clock_t start_time, end_time;
> int i, j, k;
> int loop = 1000000;
> size_t size = 1024;
> char* memseg1;
> char* memseg2;
>
> int expn = 1;
>
> int main() {
>
> printf("%d ticks per second.\n", CLOCKS_PER_SEC);
>
> for(j = 0; j < 18; j++ ) {
>
> memseg1 = malloc(size);
> memseg2 = malloc(size);
> memcpy(memseg2, memseg1, size);
>
> start_time = clock();
> k = 0;
> for( i = 0; i < loop; i++ )
> {
> if(memcmp(memseg1, memseg2, size))
> {
> k++;
> }
> }
> end_time = clock();
>
> printf("Compared %d bytes (~%d vertices), %d times, took %d
> ticks.\n", size, size / 16, loop, end_time - start_time);
> size = size * 2;
> free(memseg1);
> free(memseg2);
> }
> }
>
>
>
> On Mon, Oct 6, 2008 at 9:59 PM, Paul Ramsey <pramsey at cleverelephant.ca> wrote:
>> I can't see anything wrong with this test program, but it seems to
>> indicate that the cost of memcmp is basically constant and tiny.
>> Anyone see what I'm doing wrong? If the answer is "no", then we should
>> clearly by moving to a memcmp implementation.
>>
>>
>> #include <stdio.h>
>> #include <string.h>
>> #include <stdlib.h>
>> #include <time.h>
>>
>> clock_t start_time, end_time;
>> int i, j;
>> int loop = 10000000;
>> size_t size = 1024;
>> char* memseg1;
>> char* memseg2;
>>
>> int expn = 1;
>>
>> int main() {
>>
>> printf("%d ticks per second.\n", CLOCKS_PER_SEC);
>>
>> for(j = 0; j < 18; j++ ) {
>>
>> memseg1 = malloc(size);
>> memseg2 = malloc(size);
>> memcpy(memseg2, memseg1, size);
>>
>> start_time = clock();
>> for( i = 0; i < loop; i++ )
>> {
>> if(memcmp(memseg1, memseg2, size)) {}
>> }
>> end_time = clock();
>>
>> printf("Compared %d bytes, %d times, took %d ticks.\n", size,
>> loop, end_time - start_time);
>> size = size * 2;
>> free(memseg1);
>> free(memseg2);
>> }
>> }
>>
>
More information about the postgis-devel
mailing list