git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* [PATCH] Correct dir.c to compile on Solaris 9
@ 2007-04-15  4:33 Shawn O. Pearce
  2007-04-15 16:25 ` Johannes Schindelin
  0 siblings, 1 reply; 5+ messages in thread
From: Shawn O. Pearce @ 2007-04-15  4:33 UTC (permalink / raw
  To: Junio C Hamano; +Cc: git

The compiler on my Solaris 9 system doesn't understand
the array initialization syntax used here in dir.c.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 dir.c |   11 +++++------
 1 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/dir.c b/dir.c
index 7426fde..038fd82 100644
--- a/dir.c
+++ b/dir.c
@@ -423,18 +423,17 @@ static int cmp_name(const void *p1, const void *p2)
  */
 static int simple_length(const char *match)
 {
-	const char special[256] = {
-		[0] = 1, ['?'] = 1,
-		['\\'] = 1, ['*'] = 1,
-		['['] = 1
-	};
 	int len = -1;
 
 	for (;;) {
 		unsigned char c = *match++;
 		len++;
-		if (special[c])
+		switch (c) {
+		case 0: case '?':
+		case '\\': case '*':
+		case '[':
 			return len;
+		}
 	}
 }
 
-- 
1.5.1.1.83.g2bfe3

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] Correct dir.c to compile on Solaris 9
  2007-04-15  4:33 [PATCH] Correct dir.c to compile on Solaris 9 Shawn O. Pearce
@ 2007-04-15 16:25 ` Johannes Schindelin
  2007-04-15 21:03   ` Josef Weidendorfer
  0 siblings, 1 reply; 5+ messages in thread
From: Johannes Schindelin @ 2007-04-15 16:25 UTC (permalink / raw
  To: Shawn O. Pearce; +Cc: Junio C Hamano, git

Hi,

On Sun, 15 Apr 2007, Shawn O. Pearce wrote:

> The compiler on my Solaris 9 system doesn't understand
> the array initialization syntax used here in dir.c.
> 
> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
> ---
>  dir.c |   11 +++++------
>  1 files changed, 5 insertions(+), 6 deletions(-)
> 
> diff --git a/dir.c b/dir.c
> index 7426fde..038fd82 100644
> --- a/dir.c
> +++ b/dir.c
> @@ -423,18 +423,17 @@ static int cmp_name(const void *p1, const void *p2)
>   */
>  static int simple_length(const char *match)
>  {
> -	const char special[256] = {
> -		[0] = 1, ['?'] = 1,
> -		['\\'] = 1, ['*'] = 1,
> -		['['] = 1
> -	};
>  	int len = -1;
>  
>  	for (;;) {
>  		unsigned char c = *match++;
>  		len++;
> -		if (special[c])
> +		switch (c) {
> +		case 0: case '?':
> +		case '\\': case '*':
> +		case '[':
>  			return len;
> +		}
>  	}
>  }

You are replacing a table-based check with a switch based, which might be 
substantially slower (depends on how often cmp_name() is called).

Maybe there is another way to initialize the table (and make it static to 
begin with)?

Ciao,
Dscho

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Correct dir.c to compile on Solaris 9
  2007-04-15 16:25 ` Johannes Schindelin
@ 2007-04-15 21:03   ` Josef Weidendorfer
  2007-04-15 21:54     ` Robin Rosenberg
  0 siblings, 1 reply; 5+ messages in thread
From: Josef Weidendorfer @ 2007-04-15 21:03 UTC (permalink / raw
  To: Johannes Schindelin; +Cc: Shawn O. Pearce, Junio C Hamano, git

On Sunday 15 April 2007, Johannes Schindelin wrote:
> On Sun, 15 Apr 2007, Shawn O. Pearce wrote:
> >  static int simple_length(const char *match)
> >  {
> > -	const char special[256] = {
> > -		[0] = 1, ['?'] = 1,
> > -		['\\'] = 1, ['*'] = 1,
> > -		['['] = 1
> > -	};
> >  	int len = -1;
> >  
> >  	for (;;) {
> >  		unsigned char c = *match++;
> >  		len++;
> > -		if (special[c])
> > +		switch (c) {
> > +		case 0: case '?':
> > +		case '\\': case '*':
> > +		case '[':
> >  			return len;
> > +		}
> >  	}
> >  }
> 
> You are replacing a table-based check with a switch based, which might be 
> substantially slower (depends on how often cmp_name() is called).

Or faster. When the table gives a cache miss and has to be
loaded from main memory, I am quite sure that 5 compares in a row are
faster than the cache miss.

Actually, with the switch, the compiler is free to implement it with a
table (and gcc usually does this, probably even using a substantially
smaller table). The table-based check in contrast looks
like some kind of micro-optimization which makes the code IMHO more
difficult to read, and which only would be justified with meassured
improvements.

Josef

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] Correct dir.c to compile on Solaris 9
  2007-04-15 21:03   ` Josef Weidendorfer
@ 2007-04-15 21:54     ` Robin Rosenberg
  2007-04-15 22:48       ` Junio C Hamano
  0 siblings, 1 reply; 5+ messages in thread
From: Robin Rosenberg @ 2007-04-15 21:54 UTC (permalink / raw
  To: Josef Weidendorfer
  Cc: Johannes Schindelin, Shawn O. Pearce, Junio C Hamano, git

söndag 15 april 2007 23:03 skrev Josef Weidendorfer:
> On Sunday 15 April 2007, Johannes Schindelin wrote:
> > On Sun, 15 Apr 2007, Shawn O. Pearce wrote:
> > >  static int simple_length(const char *match)
> > >  {
> > > -	const char special[256] = {
> > > -		[0] = 1, ['?'] = 1,
> > > -		['\\'] = 1, ['*'] = 1,
> > > -		['['] = 1
> > > -	};
> > >  	int len = -1;
> > >  
> > >  	for (;;) {
> > >  		unsigned char c = *match++;
> > >  		len++;
> > > -		if (special[c])
> > > +		switch (c) {
> > > +		case 0: case '?':
> > > +		case '\\': case '*':
> > > +		case '[':
> > >  			return len;
> > > +		}
> > >  	}
> > >  }
> > 
> > You are replacing a table-based check with a switch based, which might be 
> > substantially slower (depends on how often cmp_name() is called).
> 
> Or faster. When the table gives a cache miss and has to be
> loaded from main memory, I am quite sure that 5 compares in a row are
> faster than the cache miss.
It is five compares time the length of the path being examined. The cache miss
only occurs once per invocation even inthe worst case.  Judging from where
the code is invoked, cache misses should be rare which means the table is much
faster. 

As for the table being a micro-optimization, that still holds true 

> 
> Actually, with the switch, the compiler is free to implement it with a
> table (and gcc usually does this, probably even using a substantially
> smaller table). The table-based check in contrast looks
It usually uses binary search. For gcc to create a lookup table you'll need
a large number of case's.
> like some kind of micro-optimization which makes the code IMHO more
> difficult to read, and which only would be justified with meassured
> improvements.

The table lookup *is* faster (meastured), but that doesn't make a big difference
on the total CPU used. The muliple-case-per line thing (both versions, however makes is hard
to read.  

-- robin

diff --git a/dir.c b/dir.c
index 7426fde..0780f23 100644
--- a/dir.c
+++ b/dir.c
@@ -423,12 +423,22 @@ static int cmp_name(const void *p1, const void *p2)
  */
 static int simple_length(const char *match)
 {
-       const char special[256] = {
-               [0] = 1, ['?'] = 1,
-               ['\\'] = 1, ['*'] = 1,
-               ['['] = 1
-       };
        int len = -1;
+       static const char special[256] = {
+               1,0,0,0,0,0,0,0, /* nul */
+               0,0,0,0,0,0,0,0,
+               0,0,0,0,0,0,0,0,
+               0,0,0,0,0,0,0,0,
+               0,0,0,0,0,0,0,0,
+               0,0,1,0,0,0,0,0, /* * */
+               0,0,0,0,0,0,0,0,
+               0,0,0,0,0,0,0,1, /* ? */
+
+               0,0,0,0,0,0,0,0,
+               0,0,0,0,0,0,0,0,
+               0,0,0,0,0,0,0,0,
+               0,0,0,1,1,0,0,0  /* [ \ */
+       };

        for (;;) {
                unsigned char c = *match++;

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] Correct dir.c to compile on Solaris 9
  2007-04-15 21:54     ` Robin Rosenberg
@ 2007-04-15 22:48       ` Junio C Hamano
  0 siblings, 0 replies; 5+ messages in thread
From: Junio C Hamano @ 2007-04-15 22:48 UTC (permalink / raw
  To: Robin Rosenberg
  Cc: Josef Weidendorfer, Johannes Schindelin, Shawn O. Pearce, git

Robin Rosenberg <robin.rosenberg.lists@dewire.com> writes:

> The table lookup *is* faster (meastured), but that doesn't make a big difference
> on the total CPU used. The muliple-case-per line thing (both versions, however makes is hard
> to read.  
>
> -- robin
>
> diff --git a/dir.c b/dir.c
> index 7426fde..0780f23 100644
> --- a/dir.c
> +++ b/dir.c
> @@ -423,12 +423,22 @@ static int cmp_name(const void *p1, const void *p2)
>   */
>  static int simple_length(const char *match)
>  {
> -       const char special[256] = {
> -               [0] = 1, ['?'] = 1,
> -               ['\\'] = 1, ['*'] = 1,
> -               ['['] = 1
> -       };
>         int len = -1;
> +       static const char special[256] = {
> +               1,0,0,0,0,0,0,0, /* nul */
> +               0,0,0,0,0,0,0,0,
> +               0,0,0,0,0,0,0,0,
> +               0,0,0,0,0,0,0,0,
> +               0,0,0,0,0,0,0,0,
> +               0,0,1,0,0,0,0,0, /* * */

I wonder if folding this into ctype.c::sane_ctype[] is an
option...

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2007-04-15 22:49 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-04-15  4:33 [PATCH] Correct dir.c to compile on Solaris 9 Shawn O. Pearce
2007-04-15 16:25 ` Johannes Schindelin
2007-04-15 21:03   ` Josef Weidendorfer
2007-04-15 21:54     ` Robin Rosenberg
2007-04-15 22:48       ` Junio C Hamano

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).