// This method only gets called if we are explicitly specifying base via argument to to_i private static object ParseInteger(RubyContext/*!*/ context, string/*!*/ str, int @base) { if (@base == 0) { return ParseInteger(context, str); } if (str.Length == 0) { return ScriptingRuntimeHelpers.Int32ToObject(0); } bool isNegative = false; str = ParseSign(str, ref isNegative); Tokenizer.BignumParser parser = new Tokenizer.BignumParser(); parser.Position = 0; parser.Buffer = str.ToCharArray(); BigInteger result = parser.Parse(str.Length, @base); int intValue; if (result.AsInt32(out intValue)) return ScriptingRuntimeHelpers.Int32ToObject(isNegative ? -intValue : intValue); else return isNegative ? BigInteger.Negate(result) : result; }
private void TestBigInt(string/*!*/ number, int @base, int repeat) { Stopwatch optimizedTime = new Stopwatch(); Stopwatch universalTime = new Stopwatch(); StringBuilder n = new StringBuilder(number); for (int j = 0; j < repeat; j++) { n.Append(number); } number = n.ToString(); for (int i = 0; i < number.Length - 1; i++) { string sub = number.Substring(i); string s = sub.Replace("_", "").ToUpper(); BigInteger b; Tokenizer.BignumParser p = new Tokenizer.BignumParser(); p.Position = 0; p.Buffer = s.ToCharArray(); optimizedTime.Start(); b = p.Parse(s.Length, @base); optimizedTime.Stop(); Assert(b.ToString((uint)@base) == s.TrimStart('0')); p.Position = 0; universalTime.Start(); b = p.ParseDefault(s.Length, (uint)@base); universalTime.Stop(); Assert(b.ToString((uint)@base) == s.TrimStart('0')); } if (repeat != 0) { Console.WriteLine("{0}: optimized = {1}ms, universal = {2}ms", @base, optimizedTime.ElapsedMilliseconds, universalTime.ElapsedMilliseconds); } }