Background
오랜만에 darcs
를 사용하려다가 update되었는지 확인해보려고, cabal install darcs --dry-run
을 해 보았다.
darcs
의 버전은 올라가지 않았지만, 의존성 충돌 문제가 발생했다.
뭐, 해결할 필요성은 느끼지 않았지만, darcs
는 어떤 library를 사용하는지 흥미가 생겨서 조금 살펴보았다.
그 중 흥미를 끄는 이름을 가진 library가 sandi
였다.
sandi
?
기본적으로 sandi
는 binary-to-text를 위한 encoding/decoding library다.
그 중에서 바로 눈에 들어온 것이 Codec.Binary.Base64Url
이었다.
이전에 AuthHash
를 개발하면서 base64-bytestring
을 사용해봤기 때문이다.
Compare sandi
to base64-bytestring
비슷한 기능의 library가 있는 걸 알았으니, 비교해보고 싶어지는 건 당연하다.
특히, sandi
가 더 최근에 update되어서 더 성능이 좋을 가능성도 있었다.
간단하게 criterion
으로 benchmark를 해보았다.
길고 짧은 문자열로 비교해보니 성능은 비슷한데 sandi
의 overhead가 더, 그리고 충분히 컸다.
Inspect source code
구체적인 내용까지는 살펴볼 기력은 없고, 간단히.
Inspect sandi
sandi
는 FFI를 사용해서 외부 코드를 사용하고 있다.
이건 단순한 연산이니까, 덧셈 뺄셈이 가능한 배열을 사용하는 게 더 빠를 것 같아 보이기는 하다.
Inspect base64-bytestring
이에 비해서, base64-bytestring
은 일단은 전부 Haskell로 구현되어있다.
Data.ByteString.Internal
안에 들어있는 memcpy
등을 사용하고 있는 만큼 충분히 low-level의 작업을 하고 있다.
어차피 binary를 다루는 거니까, 이런 최적화는 나쁘지 않다.
Conclusion
뭐 어쨌거나 base64-bytestring
이 더 빨랐다.
게다가 lazy한 type도 다룰 수 있기 때문에, 뭔가 도움이 될지도.
Post Revisions:
- 2017-05-20 @ 19:03:48 [현재 리비전] by QuietJoon
- 2016-10-08 @ 19:07:15 by QuietJoon
- 2016-01-18 @ 05:49:45 by QuietJoon
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.