new BigInteger(String) 性能/复杂性

2023-11-21

我想知道性能/复杂 of 构造大整数对象与new BigInteger(String)构造函数。

考虑以下方法:

  public static void testBigIntegerConstruction()
  {
    for (int exp = 1; exp < 10; exp++)
    {
      StringBuffer bigNumber = new StringBuffer((int) Math.pow(10.0, exp));
      for (int i = 0; i < Math.pow(10.0, exp - 1); i++)
      {
        bigNumber.append("1234567890");
      }

      String val = bigNumber.toString();
      long time = System.currentTimeMillis();
      BigInteger bigOne = new BigInteger(val);
      System.out.println("time for constructing a 10^" + exp
          + " digits BigInteger : " + ((System.currentTimeMillis() - time))
          + " ms");
    }
  }

该方法创建BigInteger字符串对象10^x数字,其中x=1在开始时,它随着每次迭代而增加。它测量并输出构建相应的所需时间BigInteger object.

在我的机器(Intel Core i5 660,JDK 6 Update 25 32 位)上,输出为:

time for constructing a 10^1 digits BigInteger : 0 ms
time for constructing a 10^2 digits BigInteger : 0 ms
time for constructing a 10^3 digits BigInteger : 0 ms
time for constructing a 10^4 digits BigInteger : 16 ms
time for constructing a 10^5 digits BigInteger : 656 ms
time for constructing a 10^6 digits BigInteger : 59936 ms
time for constructing a 10^7 digits BigInteger : 6227975 ms

虽然忽略最多 10^5 行(由于(处理器)缓存效果、JIT 编译等可能引入的失真),我们可以清楚地看到 O(n^2) 的复杂度这里。 请记住,对 a 的每个操作BigInteger由于不变性而创建一个新的,对于大量数据来说,这是一个重大的性能损失.

问题:

  • 我错过了什么?

  • 为什么会这样呢?

  • 这个问题在最新的 JDK 中修复了吗?

  • 还有其他选择吗?

UPDATE:

我做了进一步的测量,我可以从一些答案中证实这一说法:
看起来BigInteger针对后续数值运算进行了优化,但代价是大量数字的构建成本较高,这对我来说似乎是合理的。


简化自source在某种程度上,情况确实如此,因为在“传统”字符串解析循环中

for each digit y from left to right:
  x = 10 * x + y

你有这样的问题10 * x所花费的时间与长度呈线性关系x,不可避免地,每个数字的长度或多或少都会增加一个常数因子,这也是不可避免的。

(实际的实现比这更聪明——它尝试解析一个int一次相当于二进制数字,因此循环中的实际乘数更有可能是 1 或 20 亿——但是,是的,它总体上仍然是二次的。)

也就是说,一个数字10^6digits 至少是一个 googol,这比我听说过的任何数字都大,甚至用于加密目的。你正在解析一个字符串两兆内存。是的,这需要一段时间,但我怀疑 JDK 作者没有看到针对如此罕见的用例进行优化的意义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

new BigInteger(String) 性能/复杂性 的相关文章

  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • Erlang 函数的返回值

    下面的函数会返回什么 好的原子还是Cmd function test gt Cmd os cmd ls io format The result of ls is p n Cmd 如果它返回 ok 那么应该如何改写以返回 Cmd 同时仍然使
  • CryptoAPI:使用 CryptVerifySignature 使用公钥验证来自 openssl 的签名

    我正在尝试移植水族总理Mac 到 Windows 的框架 在 Mac 上 它使用 openssl 库 我尝试了解如何将其移植到 Windows 我猜我必须使用 CryptoAPI 我主要需要使用给定的公钥验证生成的签名的代码 以下是使用 o
  • JS、图像和CSS被HTTPModule拦截

    我有一个简单的 HTTPModule 它执行一些自定义会话状态管理 public void Init HttpApplication context context AcquireRequestState new EventHandler
  • 使用标准化表真的更好吗?

    我听到我的团队领导说 在过去的一些项目中 他们必须取消标准化以使查询更快 我认为这可能与表联合有关 拥有更多的瘦表真的比拥有很少的胖表效率低吗 这取决于 连接表本质上比拥有一个 预连接 即非规范化 的大表慢 然而 通过非规范化 您将创建数据
  • 如何判断两个多边形是否相交?

    想象一下 我有 4 个点的坐标 它们形成一个多边形 这些点在 C 中使用 PointF 表示 如果我有 2 个多边形 使用 8 个点 我如何判断它们是否相交 矩形类有一个名为 IntersectsWith 的方法 但我找不到与 Graphi
  • 预编译 JDBCPreparedStatement 有什么作用?

    预编译 语句有什么作用 因为我已经看到了 如果我使用错误的 SQL 语法编写准备好的语句 编译不会报告 任何问题 那么 如果预编译准备好的语句不检查语法有效性 那么它到底做了什么 创建一个PreparedStatements可能涉及也可能不
  • Nokogiri 需要 Ruby 版本 < 2.3

    我正在尝试让 Rails 在 Windows 10 上工作 我正在使用 Ruby 2 3 0 和 Rails 4 2 6 并且暂时使用 Nokogiri 1 6 3 当我尝试跑步时rails new demo 它返回一个错误 An erro
  • akka.net 有没有办法获取或创建 actor

    对于我的 Actor 层次结构 在通过几个 Actor 处理数据之前 我不知道所需的所有 Actor 因此我正在寻找一种方法来返回现有 ActorRef 或创建新操作 这就是我希望下面的代码要么创建一个演员 如果 my id 1 不存在 要
  • 在插入或拖动“和”放置顺序更改后重新索引对象数组的算法

    假设我有一个对象的索引数组 例如包含一首流行民歌的歌词的对象 var lyrics line 2 words He s a lumberjack and he s okay line 1 words I m a lumberjack and
  • ClassCastException:android.widget.LinearLayout$LayoutParams

    因此 我在 FinderActivity class 中执行适配器时收到此错误 public class FinderActivity extends ListActivity private List
  • 方案,SICP,R5RS,为什么延迟不是特殊形式?

    这是关于 SICP 的第 3 5 章 其中正在讨论流 这个想法是 cons stream 1 display hey 不应该评估 cons stream 的第二部分 因此它不应该打印 hey 这确实发生了 我得到以下输出 嘿 1 所以我的结
  • Datastax Cassandra 驱动程序抛出 CodecNotFoundException

    确切的异常如下 com datastax driver core exceptions CodecNotFoundException 找不到请求的操作的编解码器 varchar java math BigDecimal 这些是我正在使用的软
  • PCRE/PHP 中匹配 Unicode 字母字符

    我正在尝试用 PHP 编写一个相当宽松的名称验证器 我的第一次尝试包含以下模式 unicode letters apostrophe hyphen space namePattern p L 这最终被传递给一个调用preg match 据我
  • rmarkdown 生成的 pdf 文档中的表格标题

    如何在 rmarkdown 生成的 pdf document 中的表格浮动中获取标题 Using output pdf document fig caption true and r fig cap a caption myplot 生成一
  • 线程完成后是否会释放锁?

    我在一些地方读到 获得一个Lock没有将以下代码括在 a 中的对象try finally阻塞 这样即使抛出异常也可以释放锁 这听起来像是一个简单的问题 当线程结束时 属于该线程的所有锁是否都会自动释放 我问这个问题的原因是 我正在处理的程序
  • 在python中添加背景图像

    我正在尝试用 Python 将背景图像添加到画布上 到目前为止 代码如下所示 from Tkinter import from PIL import ImageTk Image other stuffs root Tk canvasWidt
  • 如何将VBA集合写入Excel工作表[重复]

    这个问题在这里已经有答案了 我正在修改一些现有代码 此代码从预先存在的工作表中创建行的集合 它创建一个大型的二维集合 每列中都有不同的信息 有一个单独的类模块声明每列的数据类型 该代码通过依次循环遍历每个项目 将二维集合写入新工作表 我以前
  • SQL Server 和 REAL 数据类型的舍入问题

    在 SQL Server 2008 中舍入时 我看到一些奇怪的行为 给出以下代码 DECLARE Value REAL SELECT Value 35 SELECT ROUND Value 1 我预计该值为 0 4 但它输出为 0 3 我必
  • Android Facebook 单点登录 - 可以使用多个密钥哈希吗?

    我们正在为我们的一款 Android 应用程序使用 Facebook SSO 单点登录 它运行良好 只是我们有 3 名开发人员使用调试密钥构建应用程序 然后使用我们为市场签名的发布密钥 有没有什么方法可以让 facebook SSO 使用多
  • new BigInteger(String) 性能/复杂性

    我想知道性能 复杂 of 构造大整数对象与new BigInteger String 构造函数 考虑以下方法 public static void testBigIntegerConstruction for int exp 1 exp l