趣味で書いてるSwift
最近、引き続き趣味でCベースのライブラリのSwiftバインディングを書いている。Swift使ってポインタの気持ちになるのは難しい。
今試しているのが intel/hyperscan というintelが作っているめちゃくちゃ速い正規表現のライブラリで、一部のユースケースに特化してパフォーマンスあげているらしい。最近はGitHubもアクセストークンを検知する処理の中で使っているとか。
こんなことし始めたのもこのページを見てからで、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の入力にも対応できたらカッコ良さそう。