From: Gerd Stolpmann <gerd@gerd-stolpmann.de>
To: Chris Hecker <checker@d6.com>,
eijiro_sumii@anet.ne.jp, caml-list@inria.fr
Cc: gerd@gerd-stolpmann.de, sumii@venus.is.s.u-tokyo.ac.jp
Subject: Re: substring match like "strstr"
Date: Mon, 11 Dec 2000 23:22:08 +0100 [thread overview]
Message-ID: <0012112341150J.00625@ice> (raw)
In-Reply-To: <4.3.2.7.2.20001211103237.00c12100@shell16.ba.best.com>
On Mon, 11 Dec 2000, Chris Hecker wrote:
>Any ideas why strstr blows the others away?
It's the type of brain-dead loop for which C compilers are written.
>Have you tried a purely imperative version? I'd say I'd do the tests myself,
>but I don't have a bunch of gene sequences laying around. :)
It's not always the imperative version which is better. The difference in the
generated code of a functional and an imperative version is often minimal.
>Looking at the asm output from strstr_imp, there's not that much you could do
>to make it better. Maybe there are a few peephole things, and there are
>probably 30% more instructions than you need in this specific case because the
>code to compare characters goes to the trouble of keeping the ints in the caml
>format even in registers inside the loop (so they're shifted back and forth),
>and it converts the chars from the unsafe_gets to full caml ints, which is
>useless since they just get compared to each other and then dumped. It might
>be interesting to write a peephole optimizer aimed at peepholing camlopt code,
>and looking for things like this.
>
>Can anybody optimize the caml src for strstr_imp?
let strstr_imp2 pat str =
let strlen = String.length str in
let patlen = String.length pat and
i = ref 0 and
f = ref strlen in
let i_limit = strlen - patlen in
while !i < i_limit do
let pati = ref 0 and
j = ref !i in
while !pati < patlen &&
String.unsafe_get str !j == String.unsafe_get pat !pati do
pati := succ !pati;
j := succ !j;
done;
if !pati = patlen then
begin f := !i; i := strlen end
else
i := succ !i
done;
!f
;;
Perhaps !pati < patlen can also be removed by introducing a "guard" (modifying
the last character of pat such that the loop runs always into an inequality).
However, this would require extra code managing the temporary modification of
pat, and I guess it is not worth-while for short pats.
Gerd
--
----------------------------------------------------------------------------
Gerd Stolpmann Telefon: +49 6151 997705 (privat)
Viktoriastr. 100
64293 Darmstadt EMail: gerd@gerd-stolpmann.de
Germany
----------------------------------------------------------------------------
next prev parent reply other threads:[~2000-12-12 9:22 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2000-12-08 6:04 eijiro_sumii
2000-12-08 12:57 ` Gerd Stolpmann
2000-12-10 13:16 ` eijiro_sumii
2000-12-10 15:39 ` Gerd Stolpmann
2000-12-11 3:57 ` eijiro_sumii
2000-12-12 13:58 ` Julian Assange
2000-12-11 21:07 ` Chris Hecker
2000-12-11 22:22 ` Gerd Stolpmann [this message]
2000-12-12 5:06 ` Chris Hecker
2000-12-12 12:28 ` Jean-Christophe Filliatre
2000-12-13 10:02 ` eijiro_sumii
2000-12-13 10:17 ` Eijiro Sumii
2000-12-13 10:53 ` Julian Assange
2000-12-13 13:28 ` Eijiro Sumii
2000-12-12 3:28 ` eijiro_sumii
2000-12-13 1:12 ` John Prevost
2000-12-13 2:35 ` Chris Hecker
2000-12-12 10:07 ` Sven LUTHER
2000-12-14 3:36 ` eijiro_sumii
2000-12-14 6:48 ` Chris Hecker
2000-12-14 8:02 ` eijiro_sumii
2000-12-14 21:53 ` Stephan Tolksdorf
2000-12-14 21:12 Ruchira Datta
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0012112341150J.00625@ice \
--to=gerd@gerd-stolpmann.de \
--cc=caml-list@inria.fr \
--cc=checker@d6.com \
--cc=eijiro_sumii@anet.ne.jp \
--cc=sumii@venus.is.s.u-tokyo.ac.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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 NNTP newsgroup(s).