public inbox for java-prs@sourceware.org
help / color / mirror / Atom feed
* [Bug libgcj/23495] java.lang.String.equals is suboptimal
       [not found] <bug-23495-11308@http.gcc.gnu.org/bugzilla/>
@ 2006-02-06 22:12 ` tromey at gcc dot gnu dot org
  2006-03-08  0:54 ` tromey at gcc dot gnu dot org
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: tromey at gcc dot gnu dot org @ 2006-02-06 22:12 UTC (permalink / raw)
  To: java-prs



------- Comment #9 from tromey at gcc dot gnu dot org  2006-02-06 22:12 -------
This seems to have stalled.

I think my preferred solution here would be to use memcmp and
let gcc and glibc fight it out for the best implementation.
How far are we from having that be a reasonable approach?


-- 

tromey at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |tromey at gcc dot gnu dot
                   |                            |org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23495


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

* [Bug libgcj/23495] java.lang.String.equals is suboptimal
       [not found] <bug-23495-11308@http.gcc.gnu.org/bugzilla/>
  2006-02-06 22:12 ` [Bug libgcj/23495] java.lang.String.equals is suboptimal tromey at gcc dot gnu dot org
@ 2006-03-08  0:54 ` tromey at gcc dot gnu dot org
  2006-03-08 14:39 ` greenrd at gcc dot gnu dot org
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: tromey at gcc dot gnu dot org @ 2006-03-08  0:54 UTC (permalink / raw)
  To: java-prs



------- Comment #10 from tromey at gcc dot gnu dot org  2006-03-08 00:54 -------
Actually, Robin, could you send your current patch for this?
It seems like we should simply put it in.


-- 

tromey at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |WAITING


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23495


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

* [Bug libgcj/23495] java.lang.String.equals is suboptimal
       [not found] <bug-23495-11308@http.gcc.gnu.org/bugzilla/>
  2006-02-06 22:12 ` [Bug libgcj/23495] java.lang.String.equals is suboptimal tromey at gcc dot gnu dot org
  2006-03-08  0:54 ` tromey at gcc dot gnu dot org
@ 2006-03-08 14:39 ` greenrd at gcc dot gnu dot org
  2006-03-09 19:17 ` tromey at gcc dot gnu dot org
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: greenrd at gcc dot gnu dot org @ 2006-03-08 14:39 UTC (permalink / raw)
  To: java-prs



------- Comment #11 from greenrd at gcc dot gnu dot org  2006-03-08 14:39 -------
Sorry, I can't submit patches to libjava because I'm tainted (except for the
packages that are new in Mustang, which I haven't seen). Even though this is a
small change, I prefer to err on the side of caution.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23495


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

* [Bug libgcj/23495] java.lang.String.equals is suboptimal
       [not found] <bug-23495-11308@http.gcc.gnu.org/bugzilla/>
                   ` (2 preceding siblings ...)
  2006-03-08 14:39 ` greenrd at gcc dot gnu dot org
@ 2006-03-09 19:17 ` tromey at gcc dot gnu dot org
  2006-03-10  0:39 ` tromey at gcc dot gnu dot org
  2006-03-10  0:48 ` tromey at gcc dot gnu dot org
  5 siblings, 0 replies; 13+ messages in thread
From: tromey at gcc dot gnu dot org @ 2006-03-09 19:17 UTC (permalink / raw)
  To: java-prs



------- Comment #12 from tromey at gcc dot gnu dot org  2006-03-09 19:17 -------
Fair enough.  I'm handling this.


-- 

tromey at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         AssignedTo|unassigned at gcc dot gnu   |tromey at gcc dot gnu dot
                   |dot org                     |org
             Status|WAITING                     |ASSIGNED
   Last reconfirmed|2005-08-20 19:41:09         |2006-03-09 19:17:54
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23495


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

* [Bug libgcj/23495] java.lang.String.equals is suboptimal
       [not found] <bug-23495-11308@http.gcc.gnu.org/bugzilla/>
                   ` (3 preceding siblings ...)
  2006-03-09 19:17 ` tromey at gcc dot gnu dot org
@ 2006-03-10  0:39 ` tromey at gcc dot gnu dot org
  2006-03-10  0:48 ` tromey at gcc dot gnu dot org
  5 siblings, 0 replies; 13+ messages in thread
From: tromey at gcc dot gnu dot org @ 2006-03-10  0:39 UTC (permalink / raw)
  To: java-prs



------- Comment #13 from tromey at gcc dot gnu dot org  2006-03-10 00:39 -------
Subject: Bug 23495

Author: tromey
Date: Fri Mar 10 00:39:49 2006
New Revision: 111919

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=111919
Log:
        PR libgcj/23495:
        * java/lang/natString.cc (_Jv_NewString): Use memcpy.
        (equals): Use memcmp.
        (contentEquals): Likewise.
        (getChars): Use memcpy.
        (toCharArray): Likewise.
        (regionMatches): Use memcmp.
        (regionMatches): Likewise.
        (startsWith): Likewise.
        (concat): Use memcpy.
        (valueOf): Likewise.

Modified:
    trunk/libjava/ChangeLog
    trunk/libjava/java/lang/natString.cc


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23495


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

* [Bug libgcj/23495] java.lang.String.equals is suboptimal
       [not found] <bug-23495-11308@http.gcc.gnu.org/bugzilla/>
                   ` (4 preceding siblings ...)
  2006-03-10  0:39 ` tromey at gcc dot gnu dot org
@ 2006-03-10  0:48 ` tromey at gcc dot gnu dot org
  5 siblings, 0 replies; 13+ messages in thread
From: tromey at gcc dot gnu dot org @ 2006-03-10  0:48 UTC (permalink / raw)
  To: java-prs



------- Comment #14 from tromey at gcc dot gnu dot org  2006-03-10 00:48 -------
I checked in a patch using memcpy and memcmp.
This didn't yield as dramatic a speedup for me, but did do ok.


-- 

tromey at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |RESOLVED
         Resolution|                            |FIXED
   Target Milestone|---                         |4.2.0


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23495


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

* [Bug libgcj/23495] java.lang.String.equals is suboptimal
  2005-08-20 16:23 [Bug libgcj/23495] New: " greenrd at greenrd dot org
                   ` (5 preceding siblings ...)
  2005-08-28 23:32 ` pinskia at physics dot uc dot edu
@ 2005-08-30  1:17 ` greenrd at greenrd dot org
  6 siblings, 0 replies; 13+ messages in thread
From: greenrd at greenrd dot org @ 2005-08-30  1:17 UTC (permalink / raw)
  To: java-prs


------- Additional Comments From greenrd at greenrd dot org  2005-08-30 01:17 -------
(In reply to comment #7)
> This seems like something glibc's memcmp should be doing also, could
> you report a bug to glibc about this comparison?

Actually I was wrong - it's not glibc's memcmp that's being used here, it's the
gcc inlined memcmp (see http://sources.redhat.com/bugzilla/show_bug.cgi?id=1262
), which uses the "CISC-style" instructions REP MOVSB. This performs badly in
_every_ case on athlon-xp compared to a "RISC-style" loop. (Indeed this is
documented - it's surprising that gcc has been using the wrong substitution for
so long!) So I will submit a more conservative bug about changing the inlined
memcmp into a loop, against gcc. And will test it on pentium 4 as well.

The block-compare is harder to argue for at the gcc level because it is quite
complicated for the case of memcmp on big-endian (see the glibc implementation)
and therefore probably isn't a good case for inlining, at least not on x86.

However, the block-compare makes perfect sense for the simpler case of
java.lang.String.equals, as my results show.

-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23495


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

* [Bug libgcj/23495] java.lang.String.equals is suboptimal
  2005-08-20 16:23 [Bug libgcj/23495] New: " greenrd at greenrd dot org
                   ` (4 preceding siblings ...)
  2005-08-28 23:25 ` greenrd at greenrd dot org
@ 2005-08-28 23:32 ` pinskia at physics dot uc dot edu
  2005-08-30  1:17 ` greenrd at greenrd dot org
  6 siblings, 0 replies; 13+ messages in thread
From: pinskia at physics dot uc dot edu @ 2005-08-28 23:32 UTC (permalink / raw)
  To: java-prs


------- Additional Comments From pinskia at physics dot uc dot edu  2005-08-28 23:32 -------
Subject: Re:  java.lang.String.equals is suboptimal


On Aug 28, 2005, at 7:25 PM, greenrd at greenrd dot org wrote:

>
> ------- Additional Comments From greenrd at greenrd dot org  
> 2005-08-28 23:25 -------
> memcmp (which is compiled for i686 in fedora because it is part of 
> glibc) is
> actually less efficient than the current code on my athlon! I was so 
> surprised,
> I ran the memcmp benchmark again, and the results differed by no more 
> than +/-2%.
>
> Here are the wallclock times in ms, followed by the advantage of block 
> compare
> over the current code. n is the length of the strings tested.
>
> n   | Current | block compare | memcmp | Advantage of block compare
> -------------------------------------------------------------------
> 10  | 10717   | 9236          | 11957  | 16%
> 30  | 16427   | 14618         | 19884  | 12%
> 50  | 22181   | 17539         | 27550  | 26%
> 70  | 28052   | 20978         | 35243  | 34%
> 90  | 32966   | 24695         | 42815  | 33%
> 110 | 42975   | 28453         | 55036  | 51%
>
> All these tests were done on x86 with the same -O, -g and -f flags as 
> make
> bootstrap uses by default, using LD_PRELOAD to "hot-replace" the code, 
> and
> without the assertion enabled in the benchmark.

This seems like something glibc's memcmp should be doing also, could
you report a bug to glibc about this comparison?  Also glibc's memcmp
could be improved by doing 128 byte (SSE2 and altivec) comparison
at a time so we get a nice speed up there too.

-- Pinski



-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23495


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

* [Bug libgcj/23495] java.lang.String.equals is suboptimal
  2005-08-20 16:23 [Bug libgcj/23495] New: " greenrd at greenrd dot org
                   ` (3 preceding siblings ...)
  2005-08-22 21:54 ` tromey at gcc dot gnu dot org
@ 2005-08-28 23:25 ` greenrd at greenrd dot org
  2005-08-28 23:32 ` pinskia at physics dot uc dot edu
  2005-08-30  1:17 ` greenrd at greenrd dot org
  6 siblings, 0 replies; 13+ messages in thread
From: greenrd at greenrd dot org @ 2005-08-28 23:25 UTC (permalink / raw)
  To: java-prs


------- Additional Comments From greenrd at greenrd dot org  2005-08-28 23:25 -------
memcmp (which is compiled for i686 in fedora because it is part of glibc) is
actually less efficient than the current code on my athlon! I was so surprised,
I ran the memcmp benchmark again, and the results differed by no more than +/-2%.

Here are the wallclock times in ms, followed by the advantage of block compare
over the current code. n is the length of the strings tested.

n   | Current | block compare | memcmp | Advantage of block compare
-------------------------------------------------------------------
10  | 10717   | 9236          | 11957  | 16%
30  | 16427   | 14618         | 19884  | 12%
50  | 22181   | 17539         | 27550  | 26%
70  | 28052   | 20978         | 35243  | 34%
90  | 32966   | 24695         | 42815  | 33%
110 | 42975   | 28453         | 55036  | 51%

All these tests were done on x86 with the same -O, -g and -f flags as make
bootstrap uses by default, using LD_PRELOAD to "hot-replace" the code, and
without the assertion enabled in the benchmark.

The advantage of block compare rises to 54% for n=10 and 81% for n=110 if
-march=athlon-xp is used (to compile both the original code and my block compare
code).

-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23495


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

* [Bug libgcj/23495] java.lang.String.equals is suboptimal
  2005-08-20 16:23 [Bug libgcj/23495] New: " greenrd at greenrd dot org
                   ` (2 preceding siblings ...)
  2005-08-20 19:41 ` pinskia at gcc dot gnu dot org
@ 2005-08-22 21:54 ` tromey at gcc dot gnu dot org
  2005-08-28 23:25 ` greenrd at greenrd dot org
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 13+ messages in thread
From: tromey at gcc dot gnu dot org @ 2005-08-22 21:54 UTC (permalink / raw)
  To: java-prs


------- Additional Comments From tromey at gcc dot gnu dot org  2005-08-22 21:54 -------
Robin, could you do another test where you use memcmp instead of
a hand-written loop?


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23495


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

* [Bug libgcj/23495] java.lang.String.equals is suboptimal
  2005-08-20 16:23 [Bug libgcj/23495] New: " greenrd at greenrd dot org
  2005-08-20 16:29 ` [Bug libgcj/23495] " greenrd at greenrd dot org
  2005-08-20 19:10 ` pinskia at gcc dot gnu dot org
@ 2005-08-20 19:41 ` pinskia at gcc dot gnu dot org
  2005-08-22 21:54 ` tromey at gcc dot gnu dot org
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 13+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2005-08-20 19:41 UTC (permalink / raw)
  To: java-prs


------- Additional Comments From pinskia at gcc dot gnu dot org  2005-08-20 19:41 -------
Confirmed.

-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
     Ever Confirmed|                            |1
   Last reconfirmed|0000-00-00 00:00:00         |2005-08-20 19:41:09
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23495


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

* [Bug libgcj/23495] java.lang.String.equals is suboptimal
  2005-08-20 16:23 [Bug libgcj/23495] New: " greenrd at greenrd dot org
  2005-08-20 16:29 ` [Bug libgcj/23495] " greenrd at greenrd dot org
@ 2005-08-20 19:10 ` pinskia at gcc dot gnu dot org
  2005-08-20 19:41 ` pinskia at gcc dot gnu dot org
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 13+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2005-08-20 19:10 UTC (permalink / raw)
  To: java-prs


------- Additional Comments From pinskia at gcc dot gnu dot org  2005-08-20 19:10 -------
Hmm, doing a profiling, I noticed that equals does its own loop instead of using memcmp which is 
most likely more efficient as memcmp is optimized for each target by the OS.

-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23495


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

* [Bug libgcj/23495] java.lang.String.equals is suboptimal
  2005-08-20 16:23 [Bug libgcj/23495] New: " greenrd at greenrd dot org
@ 2005-08-20 16:29 ` greenrd at greenrd dot org
  2005-08-20 19:10 ` pinskia at gcc dot gnu dot org
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 13+ messages in thread
From: greenrd at greenrd dot org @ 2005-08-20 16:29 UTC (permalink / raw)
  To: java-prs


------- Additional Comments From greenrd at greenrd dot org  2005-08-20 16:29 -------
Created an attachment (id=9549)
 --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=9549&action=view)
Benchmark

This is the equality benchmark I used. Uncomment the //ca [0] = 'b'; line and
negate the assertion to convert it into an inequality benchmark.

-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23495


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

end of thread, other threads:[~2006-03-10  0:48 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <bug-23495-11308@http.gcc.gnu.org/bugzilla/>
2006-02-06 22:12 ` [Bug libgcj/23495] java.lang.String.equals is suboptimal tromey at gcc dot gnu dot org
2006-03-08  0:54 ` tromey at gcc dot gnu dot org
2006-03-08 14:39 ` greenrd at gcc dot gnu dot org
2006-03-09 19:17 ` tromey at gcc dot gnu dot org
2006-03-10  0:39 ` tromey at gcc dot gnu dot org
2006-03-10  0:48 ` tromey at gcc dot gnu dot org
2005-08-20 16:23 [Bug libgcj/23495] New: " greenrd at greenrd dot org
2005-08-20 16:29 ` [Bug libgcj/23495] " greenrd at greenrd dot org
2005-08-20 19:10 ` pinskia at gcc dot gnu dot org
2005-08-20 19:41 ` pinskia at gcc dot gnu dot org
2005-08-22 21:54 ` tromey at gcc dot gnu dot org
2005-08-28 23:25 ` greenrd at greenrd dot org
2005-08-28 23:32 ` pinskia at physics dot uc dot edu
2005-08-30  1:17 ` greenrd at greenrd dot org

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).