|
多倍長演算などでは、長い数値を数値配列(Short、Integerなど)に変換するが、バイナリ進数でない場合は、十進法となり、厄介な処理が必要となる。ここでは、元がLongの数値を、Short配列で、万進法で表現する場合の、方式による速度比較をしたので紹介する。 ●比較対象
String型とネイティブな数値型
○文字列による処理方法 文字列の場合は、便利なメソッドが多数あり、コードはものすごく簡単になるが、果たして速度は如何に? ToStringメソッドで数値を文字列にし、4桁の倍数になるよう、右に"0"を埋める。これは、PadRightメソッドで一括処理できる。その後、SubStringメソッドで頭から4桁づつ取り出し、数値化して、Short配列に入れる。文字列による処理は簡明で魅力的ではある。 ○数値による処理 バイナリでないので処理は煩雑となり、処理時間が気になるところ。 数値を万進数の基数である、10000で整数除算し、剰余を配列0に入れ、商を次の値にして繰り返す。配列サイズは不明なので、商が0になるまで、繰り返し、配列はRedim Preserveで拡大してゆく。できた配列は順序が逆なので、Array.Reverseメソッドで入れ替える。次に、配列の最上位要素の千の位に数字が来るように、全体をシフトアップする。これは、乗算で行う。配列の後ろの0である要素を除去する。 ●結果
数値による処理が文字列処理より10倍以上速い。 ●考察 文字列による処理は、コードが非常に簡単で短くできるが、コード長には関係なく、速度が決まっている。簡明なコードが高速とは限らない例と言える。 ●結論 数値から内部形式の変換などは、多倍長では正規化処理で頻繁に現われる。ここはやはり、コードは複雑になるが、数値処理を採用すべきである。
|