つかびーの技術日記

情報系修士卒のWeb系技術日記です。現在のフォーカス分野はアドテクです。

ScalazのCordを試してみる(速度とか、使い勝手)

      2015/03/22

ScalazというScalaのライブラリ内にCordというデータ構造があります。今日はこの話です。

Cordとは

以下は引用です。

A Cord is a purely functional data structure for efficiently storing and manipulating Strings that are potentially very long. Very similar to Rope[Char], but with better constant factors and a simpler interface since it’s specialized for Strings.
引用元:http://docs.typelevel.org/api/scalaz/stable/7.0.4/doc/index.html#scalaz.Cord

とても長い可能性のある文字列を効率的に格納・操作するための純粋関数型データ構造らしいです。

これだけではよく分かりませんが、長い文字列を扱う場合はStringよりCordの方が良さそうです。

実際に試してみることにします。

文字列の結合

:+または+:で行います。当然ながら関数型なので:+で文字列をアペンドしてもそれ自体は変わりません。ですので代入しています。

文字列の切り取りなど

dropで先頭からn文字捨てます。tailは2文字目以降を返します。takeは先頭からn文字取ります。splitは指定indexで区切って2つのCordを作ります。toListはCharのListです。

結合の速度比較

StringとCordとStringBuilderで文字列結合の速度を比較してみようと思います。

以下のようなコードを用意し、実行してみます。

上記のコードのloop部分を1万、10万、100万で変えて実行してみます。

1万回 10万回 100万回
Cord 800 ms 1188 ms 7115 ms
String 234 ms 6376 ms 計測不能
StringBuilder 69 ms 30ms 351 ms

初め、Cordが思ったより早くなくて、あれ?と思ったのですが、本当に長い文字列となると話は別ですね。Stringでは話にならないレベルでもCordならなんとかなりました。StringBuilderは流石ですね。

色々パラメータ変えてみたりして試しましたが、個人的に長い文字列になる場合にCordを使うのではなく、appendする回数が多くなる可能性があるときにCord使うと良いのかなと思いました。

 - Scala, ライブラリ ,