Compare `sandi` and `byte64-bytestring`

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:

CC BY-NC-ND 4.0 This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

This site uses Akismet to reduce spam. Learn how your comment data is processed.