2010/08/02

Framework4の控えめな型

新機能の影に隠れた感のありますが、新しい型に「BigInteger」があります。
有効桁数無限大(?)の整数型です。(例外はOverflowでなく OutofMemoryだそうです)
 使い道が思いつかないのですが、必要があるから実装されたと思います。
 高桁数のπの算出は手順が確立していますが、BitIntegerで計算すると
速度的にどうなるのでしようか。

ここに(http://msdn.microsoft.com/ja-jp/library/system.numerics.biginteger.aspx)
使用例がありますが、
ソースのなかに、
BigInteger number = BigInteger.Pow(Int64.MaxValue, 2);
BigInteger number = Int64.MaxValue ^ 5;
の二種類の形式がありました。
この行で XORを使う意図が見えません。VBでのべき乗が "^"なので、補正し忘れているように思います。

それはともかく、サンプルを作って測定しました。( Athron 64*2 4600+)
▼Code

BigInteger number1 = Int64.MaxValue;
BigInteger number2 = (BigInteger)Int64.MaxValue * (BigInteger)Int64.MaxValue;
BigInteger number3 = BigInteger.Pow(Int64.MaxValue, 2);

Console.WriteLine("number1[" + number1.ToString() + "]");
Console.WriteLine("number2[" + number2.ToString() + "]");
Console.WriteLine("number3[" + number3.ToString() + "]");

▽結果
number1[9223372036854775807]
number2[85070591730234615847396907784232501249]
number3[85070591730234615847396907784232501249]


1000000回 Loopさせて、速度差Check
{
BigInteger number = Int64.MaxValue; '★
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i <= 回数; i++){number++;}
sw.Stop();
Console.WriteLine("bigInteger 所要[" + sw.ElapsedMilliseconds.ToString() + "][" + number.ToString() + "]");
}

対象の型を  BigInteger, BigInteger? , Long , Long? , Decimal , Decimal ? に変えて実行


bigInteger 所要[251msec][9223372036855775808]
bigInteger? 所要[278msec][9223372036855775808]
long 所要[ 4msec][-9223372036853775808]
long? 所要[ 41msec][-9223372036853775808]
decimal 所要[ 45msec][9223372036855775808]
decimal? 所要[ 84msec][9223372036855775808]

さすがに、ネイティブな Long型が速いのは、予想通りでしたが、
decimal型の5倍程度のコストなのは、予想外に早かった。
逆に、各型のNull許容型の遅さも意外でした。

BigInt型はstring型と同様に、変更不能型で変更の都度、新しいインスタンスを作成されます。
そこで、文字型で同じ回数のLoop測定してみました。

{
string a = "";
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i <= 回数; i++)
{
a = i.ToString();
}
sw.Stop();
Console.WriteLine("string 所要[" + sw.ElapsedMilliseconds.ToString() + "][" + a.ToString() + "]");
}

結果
string 所要[267][1000000]

ILの掃出しコードをみてませんが、数値結果から類推すると、 Biginteger,BigInteger?, string
共に、同じような値なので、文字列として演算しているような感じがします。

0 件のコメント:

コメントを投稿