abrash-black-book/14-03.md
2013-12-30 20:26:41 +11:00

146 lines
No EOL
2.2 KiB
Markdown

How fast *is* Boyer-Moore? Listing 14.1 is a C implementation of
Boyer-Moore searching; Listing 14.2 is a test-bed program that searches
up to the first 32K of a file for a pattern. Table 14.1 (all times
measured with Turbo Profiler on a 20 MHz cached 386, searching a
modified version of the text of this chapter) shows that this
implementation is generally much slower than **REPNZ SCASB,** although
it does come close when searching for long patterns. Listing 14.1 is
designed primarily to make later assembly implemenmore comprehensible,
rather than faster; Sedge's implementation uses arrays rather than
pointers, is a great deal more compact and very clever, and may be
somewhat faster. Regardless, the far superior performance of **REPNZ
SCASB** clearly indicates that assembly language is in order at this
point.
* * * * *
"g;"
"Yogi"
"igoY"
"Adrian"
"Conclusion"
"You don't know what you know"
* * * * *
Searching approach
(16K)
(16K)
(16K)
(\<1K)
(16K)
(16K)
REPNZ SCASB on first char a(Listing 9.1)
8.2
7.5
9.7
0.4
7.4
8.1
REPNZ SCASB on least common char (Listing 9.2)
7.6
7.5
7.5
0.5
7.5
7.5
Boyer-Moore in C (Listing 14.1)
71.0
38.4
37.7
1.8
18.2
9.2
Standard Boyer-Moore in ASM(code not shown)
38.5
21.0
20.5
0.8
9.4
4.8
Quick handling of first mismatch Boyer-Moore in ASM(Listing 14.3)
14.1
8.9
7.7
0.4
4.0
2.0
\<=255 pattern length + sentinelBoyer-Moore in ASM(Listing 14.4)
8.1
5.2
4.6
0.3
2.6
1.2
Search pattern (approximate distance searched before match is shown in
parentheses).\
Times are in milliseconds; shorter is better.
* * * * *
Table 14.1 Comparison of searching techniques.
* * * * *
The entry "Standard Boyer-Moore in ASM" in Table 14.1 refers to
straight-forward hand optimization of Listing 14.1, code that is not
included in this chapter for the perfectly good reason that it is slower
in most cases than **REPNZ SCASB.** I say this casually now, but not so
yesterday, when I had all but concluded that Boyer-Moore was simply
inferior on the x86, due to two architectural quirks: the string
instructions and slow branch. I had even coined a neat phrase for it:
Architecture is destiny. Has a nice ring, doesn't it?