[Ocfs2-devel] [PATCH] ocfs2: make lockres lookup faster
Wengang Wang
wen.gang.wang at oracle.com
Thu Apr 29 19:39:07 PDT 2010
updates:
The test c file was not well written, so that the comparation is removed
by the optimization. I retested and got following result:
[wwg at cool src]$ ./a.out "1234567890123456789012345678901"
"1234567890123456789012345678902" 199999 9999
1234567890123456789012345678901 31
1234567890123456789012345678902 31
loops 199999 x 9999
loops 9999 199999
orig cost 122s
loops 9999 199999
new cost 124s
That is after the change, it become slower. It's out of my thought :-(.
Also with 32 long strs, it's slower.
[wwg at cool src]$ ./a.out "12345678901234567890123456789010"
"12345678901234567890123456789020" 29999 9999
12345678901234567890123456789010 32
12345678901234567890123456789020 32
loops 29999 x 9999
loops 9999 29999
orig cost 18s
loops 9999 29999
new cost 19s
Attached the test c file.
compiled with gcc -O2 2.c
regards,
wengang.
On 10-04-29 17:31, Wengang Wang wrote:
> Hi Sunil,
>
> On 10-04-28 10:14, Sunil Mushran wrote:
> > The dlm interface allows different sized locknames. And the locknames can be
> > binary. That we use mostly ascii is just coincidental. Yes, mostly.
> > The dentry
> > lock is partially binary. Also, $RECOVERY is used only during recovery.
> >
> > So the only interesting bit from my pov would be:
> >
> > - if (memcmp(res->lockname.name + 1, name + 1, len - 1))
> > + if (memcmp(res->lockname.name, name, len))
>
> Yes, then it's the only bit.
> > Will just this change improve performance? How long a hash list would need
> > to be for us to see an appreciable improvement?
> I didn't do a test for only this bit, but for the whole change.
> For the test I did the test c files are complied with no optimization.
>
> I, just now, tested for only this bit with -O2 optimization, I can _not_ see
> improvement for even a 1999999 x 99999 loops of comparation. So please
> ignore this patch.
>
> Compiled with no optimization, the comparation is done against each
> charator one by one? It's funny.
>
-------------- next part --------------
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <string.h>
#define LOOPCNT 199999
#define LOOPCNT2 9999
unsigned char *name1 = "12345678901234567890123456789012";
unsigned char *name2 = "12345678901234567890123456789012";
unsigned int len1 = 32, len2 = 32;
unsigned int loop1 = LOOPCNT, loop2 = LOOPCNT2;
int func1(unsigned int loop1, unsigned int loop2)
{
int i,j;
for (j = 0; j < loop1; j++) {
for (i = 0; i < loop2; i++) {
if (name1[0] != name2[0])
continue;
if (len1 != len2)
continue;
if (memcmp(name1 + 1, name2 + 1, len1 - 1))
continue;
break;
}
}
printf("loops %d %d\n", i,j);
return i + j;
}
int func2(unsigned int loop1, unsigned int loop2)
{
int i,j;
for (j = 0; j < loop1; j++) {
for (i = 0; i < loop2; i++) {
if (name1[0] != name2[0])
continue;
if (len1 != len2)
continue;
if (memcmp(name1, name2, len1))
continue;
break;
}
}
printf("loops %d %d\n", i,j);
return i + j;
}
int main(int argc, char **argv)
{
int a;
struct timeval timev1, timev2;
name1 = argv[1];
name2 = argv[2];
loop1 = atoi(argv[3]);
loop2 = atoi(argv[4]);
len1 = strlen(name1);
len2 = strlen(name2);
printf("%s %d\n", name1, len1);
printf("%s %d\n", name2, len2);
printf("loops %d x %d\n", loop1, loop2);
gettimeofday(&timev1, NULL);
a = func1(loop1, loop2);
gettimeofday(&timev2, NULL);
printf("orig cost %lds\n", timev2.tv_sec - timev1.tv_sec);
gettimeofday(&timev1, NULL);
a += func2(loop1, loop2);
gettimeofday(&timev2, NULL);
printf("new cost %lds\n", timev2.tv_sec - timev1.tv_sec);
return a;
}
More information about the Ocfs2-devel
mailing list