-
Notifications
You must be signed in to change notification settings - Fork 29.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
src: replace naive search in Buffer::IndexOf
Adds the string search implementation from v8 which uses naive search if pattern length < 8 or to a specific badness then uses Boyer-Moore-Horspool Added benchmark shows the expected improvements Added option to use ucs2 encoding with Buffer::IndexOf
- Loading branch information
Showing
8 changed files
with
4,931 additions
and
60 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
var common = require('../common.js'); | ||
var fs = require('fs'); | ||
|
||
var bench = common.createBenchmark(main, { | ||
search: ['@', 'SQ', '10x', '--l', 'Alice', 'Gryphon', 'Panther', | ||
'Ou est ma chatte?', 'found it very', 'among mad people', | ||
'neighbouring pool', 'Soo--oop', 'aaaaaaaaaaaaaaaaa', | ||
'venture to go near the house till she had brought herself down to', | ||
'</i> to the Caterpillar'], | ||
encoding: ['undefined', 'utf8', 'ucs2', 'binary'], | ||
type: ['buffer', 'string'], | ||
iter: [1] | ||
}); | ||
|
||
function main(conf) { | ||
var iter = (conf.iter) * 100000; | ||
var aliceBuffer = fs.readFileSync(__dirname + '/../fixtures/alice.html'); | ||
var search = conf.search; | ||
var encoding = conf.encoding; | ||
|
||
if (encoding === 'undefined') { | ||
encoding = undefined; | ||
} | ||
|
||
if (encoding === 'ucs2') { | ||
aliceBuffer = new Buffer(aliceBuffer.toString(), encoding); | ||
} | ||
|
||
if (conf.type === 'buffer') { | ||
search = new Buffer(new Buffer(search).toString(), encoding); | ||
} | ||
|
||
bench.start(); | ||
for (var i = 0; i < iter; i++) { | ||
aliceBuffer.indexOf(search, 0, encoding); | ||
} | ||
bench.end(iter); | ||
} |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#include "string_search.h" | ||
|
||
namespace node { | ||
namespace stringsearch { | ||
|
||
int StringSearchBase::kBadCharShiftTable[kUC16AlphabetSize]; | ||
int StringSearchBase::kGoodSuffixShiftTable[kBMMaxShift + 1]; | ||
int StringSearchBase::kSuffixTable[kBMMaxShift + 1]; | ||
} | ||
} // namespace node::stringsearch |
Oops, something went wrong.