趣味で書いてるSwift

最近、引き続き趣味でCベースのライブラリのSwiftバインディングを書いている。Swift使ってポインタの気持ちになるのは難しい。

今試しているのが intel/hyperscan というintelが作っているめちゃくちゃ速い正規表現のライブラリで、一部のユースケースに特化してパフォーマンスあげているらしい。最近はGitHubもアクセストークンを検知する処理の中で使っているとか

github.com

こんなことし始めたのもこのページを見てからで、NSRegularExpressionめっちゃ遅いじゃんって思ってなんとなくこのベンチマーク早く出来たら面白そうというところから試してみている。

Swift vs Go - Which programs are faster? | Computer Language Benchmarks Game

とりあえず同期的にパターンとマッチングするコードは書けるようになった。

import Hyperscan

let scanner = Hyperscan()
print("かえるぴょこぴょこみぴょこぴょこ")
print(scanner.scan("かえるぴょこぴょこみぴょこぴょこ", for: "ぴょこ")?.matches)
// => Optional([Hyperscan.Match(from: 0, to: 18), Hyperscan.Match(from: 0, to: 27), Hyperscan.Match(from: 0, to: 39), Hyperscan.Match(from: 0, to: 48)])

print("123456789")
print(scanner.scan("123456789", for: "123")?.matches)
//=> Optional([Hyperscan.Match(from: 0, to: 3)])

print("abcdfabacbabac")
print(scanner.scan("abcdfabacbabac", for: "aba")?.matches)
// => Optional([Hyperscan.Match(from: 0, to: 8), Hyperscan.Match(from: 0, to: 13)])

パフォーマンスの都合上、マッチ開始位置はデフォルトでは保持されないようになっていて、返すためにはオプションを渡す必要があるとのこと。まだ返り値がbytes数換算でのoffsetしかまだ対応していない。とりあえず動く程度なので実用的ではない。streamの入力にも対応できたらカッコ良さそう。

github.com